2010-07-21 217 views
2

我想,所以我儘量preg_match用PHP如何用正則表達式從HTML中獲取字符串?

if(preg_match('<\/div>(.*?)<div class="adsdiv">', $data, $t)) 

此塊來解析從HTML頁塊,但不工作

</div> 

blablabla 

blablabla 

blablabla 

<div class="adsdiv"> 

我想的grep只blablabla blablabla話 任何幫助

+0

請詳細描述你想要匹配什麼html文本? – ULysses 2010-07-21 10:38:23

回答

-1

你需要分隔你的正則表達式;改爲使用/<\/div>(.*?)<div class="adsdiv">/

+0

雖然它不能解決OP的問題,但這*是一個有效的點。問題中的正則表達式缺少分隔符,如果您嘗試使用它,將會拋出異常。 – 2010-07-21 13:26:41

0

PHP Manual

秒(PCRE_DOTALL) - 如果設定了此修正,在 模式中的圓點元字符的所有字符,包括 換行符相匹配。沒有它, 新行被排除在外。該修飾符 等效於Perl的/ s修飾符。 A 否定類別,例如[^ a]總是 與換行符 匹配,與此 修飾符的設置無關。

因此,下面應該工作:

if (preg_match('~<\/div>(.*?)<div class="adsdiv">~s', $data, $t)) 

~在那裏劃定的正則表達式。

+0

非常感謝你Alix其工作正常 – normand 2010-07-21 11:08:08

1

除了上面所說的之外,還加了/s修飾符,所以.將匹配換行符。 (編輯:艾倫·好心指出,[^<]+無論如何都會匹配換行符)

我總是使用/U,以及因爲在這些情況下,通常要在默認情況下最小的匹配。 (也會更快)。而且/i因爲人們說<div><DIV>,甚至<Div> ...

if (preg_match('/<\/div>([^<]+)<div class="adsdiv">/Usi', $data, $match)) 
{ 
    echo "Found: ".$match[1]."<br>"; 
} else { 
    echo "Not found<br>"; 
} 

編輯做多一點明確的!

+0

感謝mvds的回覆,但它回覆空結果意義不起作用 – normand 2010-07-21 11:02:40

+0

好吧我添加了一個小代碼,顯示如何獲得匹配的部分。這應該是有效的(但是,它要求輸入*正是*你顯示的內容;也就是說,沒有一些格式化的html被類似firefox的「查看源代碼」!) – mvds 2010-07-21 12:36:16

+0

'[^ <]'將匹配換行符,無論你使用'/s'修飾符與否。 – 2010-07-21 13:16:55

1

Regex aint the right tool for this。這裏是如何使用DOM

$html = <<< HTML 
<div class="parent"> 
    <div> 
     <p>previous div<p> 
    </div> 
    blablabla 
    blablabla 
    blablabla 
    <div class="adsdiv"> 
     <p>other content</p> 
    </div> 
</div> 
HTML; 

HTML文檔中的內容是TextNodes。標籤是ElementNodes。帶有blablabla內容的TextNode必須有父節點。對於獲取的TextNode價值,我們將假定你想要的div的ParentNode的所有TextNode與adsdiv

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xPath = new DOMXPath($dom); 
$nodes = $xPath->query('//div[@class="adsdiv"]'); 
foreach($nodes as $node) { 
    foreach($node->parentNode->childNodes as $child) { 
     if($child instanceof DOMText) { 
      echo $child->nodeValue; 
     } 
    }; 
} 

class屬性,它不是一個時髦的一個襯墊,但它也更頭疼的和爲您提供對HTML文檔的堅實控制。治理的XPath查詢電源,我們可以縮短上面

$nodes = $xPath->query('//div[@class="adsdiv"]/../text()'); 
foreach($nodes as $node) { 
    echo $node->nodeValue; 
} 

我一直是deliberatly詳細說明如何使用,雖然DOM。

相關問題