我想,所以我儘量preg_match
用PHP如何用正則表達式從HTML中獲取字符串?
if(preg_match('<\/div>(.*?)<div class="adsdiv">', $data, $t))
此塊來解析從HTML頁塊,但不工作
</div>
blablabla
blablabla
blablabla
<div class="adsdiv">
我想的grep只blablabla blablabla
話 任何幫助
我想,所以我儘量preg_match
用PHP如何用正則表達式從HTML中獲取字符串?
if(preg_match('<\/div>(.*?)<div class="adsdiv">', $data, $t))
此塊來解析從HTML頁塊,但不工作
</div>
blablabla
blablabla
blablabla
<div class="adsdiv">
我想的grep只blablabla blablabla
話 任何幫助
你需要分隔你的正則表達式;改爲使用/<\/div>(.*?)<div class="adsdiv">/
。
雖然它不能解決OP的問題,但這*是一個有效的點。問題中的正則表達式缺少分隔符,如果您嘗試使用它,將會拋出異常。 – 2010-07-21 13:26:41
秒(PCRE_DOTALL) - 如果設定了此修正,在 模式中的圓點元字符的所有字符,包括 換行符相匹配。沒有它, 新行被排除在外。該修飾符 等效於Perl的/ s修飾符。 A 否定類別,例如[^ a]總是 與換行符 匹配,與此 修飾符的設置無關。
因此,下面應該工作:
if (preg_match('~<\/div>(.*?)<div class="adsdiv">~s', $data, $t))
的~
在那裏劃定的正則表達式。
非常感謝你Alix其工作正常 – normand 2010-07-21 11:08:08
除了上面所說的之外,還加了/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>";
}
編輯做多一點明確的!
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。
請詳細描述你想要匹配什麼html文本? – ULysses 2010-07-21 10:38:23