2010-12-13 2 views
3

Grundsätzlich versuche ich preg_match zu verwenden, um alle Verknüpfungen mit einem PDF-Anhang zu finden und dann die gesamte URL zu einem Array hinzuzufügen. Der Teil, mit dem ich zu kämpfen habe, ist, wie man alles vor dem Spiel auswählt, bis zu den "Zitaten" der <a href="">. Ich möchte dies tun, damit ich das Array durchlaufen kann und mit jedem Dokument tun kann, was immer ich brauche. Ich möchte nur mit '1234.pdf' (plus irgendwelche Unterverzeichnis Info) im Array enden.php preg_match. Zum Array hinzufügen

Irgendwelche Ideen?

Das ist, was ich bisher habe, ist es nur das Spiel zurück ...

$string1 = "<a href='1234.pdf'>Document 1</a>"; 

$match = preg_match("/.pdf/i", $string1, $output); 

Dank

+2

Beachten Sie, dass '.' nicht nur dem vollständigen Stoppzeichen entspricht, sondern auch jedem anderen (außer Zeilenumbrüchen); entkomme, um nur dem '.' zu entsprechen. – Gumbo

Antwort

5

sollten Sie einen DOM-Parser verwenden, um diese Informationen zu extrahieren, weil es einfacher ist, und es ist sicherer . Dann können Sie preg_match verwenden um zu überprüfen, ob die Verbindung tatsächlich ein PDF ist oder nicht:

$html = '<a href="foo.pdf">Foo</a>'. 
     '<a href="bar.jpg">Bar</a>'. 
     '<a href="baz.pdf">Baz</a>'; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$links = $dom->getElementsByTagName('a'); 

$result = array(); 
foreach ($links as $link) { 
    $href = $link->getAttribute('href'); 
    if (preg_match('/\.pdf$/i', $href)) $result[] = $href; 
} 

print_r($result); 

Ausgänge:

Array 
(
    [0] => foo.pdf 
    [1] => baz.pdf 
) 
+1

+1 für die Bereitstellung eines Beispiels für korrekte php DOM Traversal-Techniken. – eykanal

+0

Absolut perfekt. Dies ist das erste Mal, dass ich auf "DOMDocument" stoße. Sehr nützlich, danke für Ihre Hilfe. – shane

1

Sie sollten wirklich einen richtigen HTML-Parser verwenden (netcoder Antwort sehen) und wenden ein XPath Ausdruck, um dies zu lösen. Wenn Sie gebunden sind, und bestimmt einen regulären Ausdruck zu verwenden, versuchen, etwas wie folgt aus:

$match = preg_match_all("/(?<=href=['\"])([^'\"]*\\.pdf[^'\"]*)(?=['\"])/", 
         $string1, $output); 
+0

Dies entspricht allem, was von einigen Anführungszeichen umgeben ist. – Gumbo

+0

@Gumbo: True. Ich habe die Regex angepasst, um mindestens das 'href =' - Präfix zu verlangen, aber das ist zugegebenermaßen ein sehr schlechter Weg, sich diesem zu nähern. Ich gebe nur einen Fallback-Regex, falls das OP nicht dem viel besseren Ansatz folgt, einen richtigen HTML-Parser zu verwenden. Du kannst eine Regex nur so gut machen ... – cdhowie

0

Wenn ich Sie richtig verstehe, es klingt wie Sie Untermuster verwenden müssen. Versuchen Sie so etwas wie dieses ....

$match = preg_match("/href=\"(.*\.pdf)\"/i", $string1, $output); 

Die $ Ausgangsgröße sollte ein Array mit dem Index 0 Volltextübereinstimmungen und Index 1 enthält den Text zwischen den Klammern angepasst enthält.