2011-10-28 87 views
-1

我需要使用正則表達式來捕獲href的內容。例如,當我將規則應用於 href =「www.google.com」時,我想要訪問www.google.com。另外,我想忽略所有隻有#值的hrefs。現在獲取href值的內容

,我是打了一段時間,我想出了這個:

href=(?:\"|\')((?:[^#]|.#.|.#|#.)+)(?:\"|\') 

當我嘗試一下在http://www.rubular.com/它就像一個魅力,但我需要與preg_replace_callback使用它PHP,在那裏我沒有得到預期的結果(用PHP進行測試,我使用的是這個站點:http://www.pagecolumn.com/tool/pregtest.htm)。

這是什麼錯誤?

+1

首先:不要使用正則表達式來解析HTML(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained-tags/1732454#1732454) –

+0

已確認;) – misaizdaleka

回答

9

由於使用正則表達式解析HTML是Bad Thing™,我建議減去原油方法:

$dom = new DomDocument; 
$dom->loadHTML($pageContent); 

$elements = $dom->getElementsByTagName('a'); 

for ($n = 0; $n < $elements->length; $n++) { 
    $item = $elements->item($n); 
    $href = $item->getAttribute('href'); 
    // here's your href attribute 
} 
+0

好極了!優雅高效的解決方案!很棒的建議!謝謝! – misaizdaleka

+0

@LinusKleen爲什麼這是一件壞事?我還沒有理解爲什麼用正則表達式解析HTML是一件壞事。哦,那傢伙沒有解釋爲什麼,他只是跑了。解釋會有幫助! – Mob

+1

@Mob:咆哮確實沒有意義(沒有教育效果)。當人們說「解析HTML」時,他們實際上是指「提取」。對於這些和簡單的例子,正則表達式綽綽有餘。爲了正確解析SGML和HTML(不是太多的XML和XHTML),你需要更復雜的PCRE模式。 http://stackoverflow.com/questions/4231382/regular-expression-pattern-not-matching-anywhere-in-string/4234491#4234491 - 這只是建議成爲SO的模因,現在遊標(和不正確的)答案是永遠不要使用正則表達式。 (應該取決於用例+努力。) – mario

1

如何:

href\s*=\s*"([^#"]+#?[^"]*)" 
1

首先:不要使用正則表達式解析HTML


我會去w第i個像:

href=("|')?([^\s"'])+("|')?