2014-04-14 65 views
0

我使用正則表達式來匹配頁面中的特定div,並用自定義格式替換它們。我無法使用domdocument,因爲我們處理的頁面經常是畸形的,在通過domdocument運行後,頁面會被重新格式化並且不會顯示相同的內容。php - 正則表達式來匹配div標籤

我目前使用它完美的作品如下:

preg_match('#(\<div id=[\'|"]'.$key.'[\'|"](.*?)\>)(.*?)\<\/div\>#s', $contents, $response); 

要匹配div標籤,如:

<div id="test"></div> 
<div id="test" style="width: 300px; height: 200px;"></div> 
etc... 

這個問題我現在遇到的標籤,其中ID是在後樣式或類,例如:

<div class="test" id="test"></div> 

如果我運行以下,正則表達式似乎變成貪婪y並在div標籤之前匹配了大量html,所以我不知道如何解決此問題:

preg_match('#(\<div(.*?)id=[\'|"]'.$key.'[\'|"](.*?)\>)(.*?)\<\/div\>#s', $contents, $response); 

有沒有人有任何想法?

+1

看看這個,可能對你有點幫助:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

[必備鏈接] (http://stackoverflow.com/q/4231382/471272)。 – tchrist

回答

4

您可以使用修改器Ungreedy(U),也 - 不使用.*,但[^>]*(這意味着什麼,是不是>爲>是標籤的結束和你正在尋找withing標籤)。你不需要逃避/時,這是不是你的分隔符(您正在使用#作爲分隔符)

preg_match('#(<div[^>]*id=[\'|"]'.$key.'[\'|"][^>]*>)(.*)</div>#isU', $contents, $response); 
+0

+1'[^>] *'在Regex解析HTML時非常有價值。 – iambriansreed

+0

我<3棧溢出,謝謝你的答案。 10分鐘後延時結束,我會接受。 – Joe

0

不要使用正則表達式的HTML解析,有DOM解析器在那裏,像PHP DOM:http://www.php.net/manual/en/book.dom.php

+1

沒錯,但要使用它們,你需要一個有效的dom,這可能意味着首先整潔,然後實現dom對象,這可能會造成很大的開銷。有時候,特別是當你在尋找特定的信息時,當你用兩行代碼寫一個簡單的正則表達式時,通過Dom解析的整個過程是沒有意義的。 – Yitzhak

+0

有沒有必要害怕這個東西。這只是一個電鋸。 – Yitzhak