2012-10-19 155 views
1

我想根據以下正則表達式在網頁上獲得匹配: (。*) 我在regexpal.com(在線正則表達式測試工具)上測試它,它工作正常。 但是,當我在PHP中使用它時,我找不到任何匹配。我在php中使用的聲明是preg_match_all不能正常工作

preg_match_all("/<a href=\"\/title\/.*\/\">(.*)<\/a>/", $content, $matches); 

我檢查了$內容,它是正確的。那麼我的聲明有什麼不對嗎?謝謝!

+0

嘗試(。*?)而不是(。*) – Adam

+0

奇怪。你能展示應該由該正則表達式覆蓋的實際HTML的例子嗎? – raina77ow

+0

請不要使用正則表達式來解析HTML。使用PHP DOM模塊。 http://htmlparsing.com/php.html –

回答

4

請,請...對上帝的愛,讓您的正則表達式懶惰(非貪婪),不換行處理正則表達式在/中使用URL或HTML。你必須逃避所有的地方。它是可怕的。看看這裏:

preg_match_all('~<a href="/title/[^">]+/">(.*?)</a>~si', $content, $matches); 
  1. 單引號。不再需要轉義雙引號。如果您沒有可擴展的「{$變量}」,爲什麼會使用雙引號?
  2. 將RegExp換成任何非保留字符。對於URL和HTML /是最糟糕的選擇,因爲它拖累你逃避冗餘地獄。
  3. 使用'si'作爲標記在HTML中作爲標記可以是多行和。+?要麼 。*?匹配多行默認情況下。你需要不區分大小寫。
  4. 避免使用。在屬性。您可能會捕獲整個標籤。也添加中斷字符。看到我上面的模式...所以如果HTML被破壞,你不要這樣做。

還有更多的方法來改善這一點,但這應該做到這一點。

希望它有幫助。

+1

這是很好的。很多非常好的正則表達式技巧,最後三個在PHP之外也是可操作的。這應該是被接受的答案,如果它有效(我懷疑它的確如此)。 – FrankieTheKneeMan

0
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches); 

我會嘗試:

preg_match_all('/<a href\=".title.*">(.*?)<\/a>/', $content, $matches); 

贅述。

1

您需要通過添加? >>

preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches); 
+0

'='也需要轉義,對吧? – Adam

+1

@Adam - 無需轉義'=' –

+0

+1有用的知識。 – Adam