2015-06-01 22 views
1

我曾試圖在HTML代碼來搜索這個,怎麼可以修復?Preg_match_all具體環節

<a href="http://www.filman.cz/ex-machina-2015-3/" rel="bookmark"> 

(僅鏈接)

我用這個preg_match_all,但它似乎是寫的不好

preg_match_all("/<a href=\"([^\"]*)\"/", $links_area, $matches); 

我不知道爲什麼,但它不起作用。我認爲某個地方會被嚴重地寫成「/」或「*」,但我不完全清楚。 順便說一下,爲什麼這個網站上的「質量標準」如此之難?我有問題在這裏發佈一切。

回答

0

你可以使用這個正則表達式。它匹配從<a開始的所有元素,並選擇href=""屬性的內部。

<a(?:[^>])+href="(https?\:\/\/[^\"]+)\"(?:[^>])*>

編輯:我完全忘了Xpath的..它是明確設計這樣的工作,所以從HWND使用的答案,那就是分析HTML文檔的最佳選擇。

0

我認爲,這可能是效率較低,但更準確的

/<a\s+href="(http(?:s)?:\/\/[\w\.\/-]+)".*?>/g 

說明:

<a\s+ - >標記 '的' +空格

href=\" - > HREF直到報價

(http(?:s)? - > http或https

: \/\/ - >文字 「:」 和 「//」

[\w\.\/-]+) - >網址字符

".*?> - >文字的報價和其他任何東西,直到 「>」

PHP代碼:

$re = "/<a\\s+href=\"(http(?:s)?:\\/\\/[\\w\\.\\/-]+)\".*?>/"; 
$str = "<a href=\"http://www.filman.cz/ex-machina-2015-3/\" rel=\"bookmark\">"; 

preg_match_all($re, $str, $matches); 

DEMO

4

我會考慮利用DOM和這個任務的XPath,下面是一個例子:

$doc = DOMDocument::loadHTML(' 
    <a href="http://www.filman.cz/ex-machina-2015-3/" rel="bookmark"> 
    <a href="http://www.facebook.com">Visit Us On Facebook</a> 
    <a href="https://www.paypal.com">Pay Now</a> 
    <a href="http://www.filman.cz/ex-machina-2015-5/" rel="bookmark"> 
'); 

$xp = new DOMXPath($doc); 

foreach ($xp->query('//a[@rel="bookmark"]') as $link) { 
    $matches[] = $link->getAttribute('href'); 
} 

print_r($matches); 

輸出

Array 
(
    [0] => http://www.filman.cz/ex-machina-2015-3/ 
    [1] => http://www.filman.cz/ex-machina-2015-5/ 
) 

注:我不知道你所期望的輸出是什麼,但是這將幫助你避免使用正則表達式。

如果你只是想匹配的是包含「filman.cz」的@href值,你可以簡單地使用 OR substring()與XPath查詢。