2013-05-12 101 views
-2

我需要從網站上刮取一些數據。爲此,我正在使用preg_match,但我無法爲其編寫正則表達式。網站上的數據是preg_match正則表達式不工作

title="Russia"/></a> 
     <small>*</small> <a href="/profile/roman 

我寫的正則表達式爲#title=\"Russia\"\/><\/a>((\n|\r)*)<small>*<\/small> <a href=\"/profile/(.+?)\"#sx

但這不是工作,我不知道爲什麼?當我回應我的正則表達式時,它說#title="Russia"\/><\/a>((|)*)*<\/small>。其他人去了哪裏?爲什麼它不工作?

+0

當你回聲的正則表達式?爲什麼你需要回顯正則表達式? – adeneo 2013-05-12 15:30:20

+1

你錯誤地應用了一些正則表達式元字符。你還用雙引號將正則表達式括起來,結果''''丟掉了,'\ r \ n'被轉換成實際的cr /換行符,並且在網頁中輸出未轉義的''將使其消失 – mario 2013-05-12 15:30:25

+2

如果你使用正則表達式來解析HTML,那麼你可能做錯了什麼,爲什麼你不使用PHP的DOM解析器? – Spudley 2013-05-12 15:30:59

回答

0

試試這個:

#title=\"Russia\"/></a>(\s*)<small>\*</small>\s+<a\s+href=\"/profile/(.+?)\"#sx 

我躲過了*因爲它的元字符。沒有它,你會匹配包含單詞small的字符串,接着是0或更多> s。

0

你真的不應該使用正則表達式來評估標記內容,特別是當你通過廢除頁面來獲取標記內容時。

在你的情況下,至少有三個原因可能導致你的正則表達式被破壞。

  1. 不要嘗試寫自己的空格評估時,你可以簡單地使用\s表示「任何空白字符」

  2. 正則表達式中星號(*)具有特殊的意義這就是爲什麼你不能簡單地用它來識別星號。如果您想收集小屬性中的內容,則應該使用<small>(.*)</small>。另一方面,如果你實際上期待星號,那麼你必須像這樣逃脫它<small>\*</small>

  3. 您的正則表達式希望在您最近的<a>上有href屬性的結束報價,但在您的樣本標記中您沒有。只要在原始頁面上有一個結束引用,下面的正則表達式應該可以做到。

    #title=\"Russia\"\/><\/a>(\s*)<small>\*</small> <a href="/profile/(.+)?\"#sx

不過我再次使用DOM解析器勸告像DOMDocument這不僅是因爲它處理標記內容,而且還當是更爲可靠,因爲它可以解釋糟糕的標記,以及(如果它當然加載爲HTML)。