2010-12-13 23 views
3

私は基本的にpreg_matchを使用してPDF添付ファイルを持つすべてのリンクを見つけて、URL全体を配列に追加しようとしています。私が苦労している部分は、一致する前にすべてを選択する方法です。<a href="">の "引用符"までです。私は配列をループすることができ、各ドキュメントで必要なことを行うことができるように、これを実行したいと思います。私はちょうど'1234.pdf'(と任意のサブディレクトリ情報)の配列にしたいです。php preg_match。配列に追加

アイデア?これは私がこれまでのところ、それが唯一の試合を返す持っているものである

...

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

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

おかげ

+2

'.'は完全停止文字だけでなく、他の(改行を除く)も一致します。 '.'にのみマッチするようにエスケープします。 – Gumbo

答えて

5

あなたはそれが簡単だから、その情報を抽出するために、DOMパーサを使用する必要があり、それは安全です。その後、リンクが実際にPDFであるかないかどうかを確認するためにpreg_matchを使用することができます。

$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); 

出力:

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

+1正しいPHP DOMトラバーサル手法の例を実際に提供しています。 – eykanal

+0

絶対完璧です。これは、初めてDOMDocumentを見たときです。非常に便利です、あなたの助けに感謝します。 – shane

1

あなたが本当に適切なHTMLパーサを使用する(netcoderの答えを参照)とXPathを適用する必要がありますがこれを解決する表現。あなたがバインドされ、正規表現を使用することが決定された場合、このような何かを試してみてください:私が正しくあなたを理解していれば、あなたがサブパターンを使用する必要があるよう

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

これは、引用符で囲まれたものと一致します。 – Gumbo

+0

@Gumbo:True。正規表現を少なくとも "href ="接頭辞を必要とするように調整しましたが、これはこれに接近するための非常に悪い方法です。私は、OPが適切なHTMLパーサを使うより良いアプローチに従わない場合に備えて、フォールバック正規表現を提供するだけです。あなたはこのような正規表現をうまく実行することができます... – cdhowie

0

は、それが聞こえます。このような何かを試してみてください....

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

$出力変数は、括弧の間からマッチしたテキストを含むフルテキストマッチとインデックス1を含むインデックス0の配列でなければなりません。