2010-01-07 128 views
0
<div class="begin">...</div> 

如何匹配PHP中的HTML(包括)<div class="begin">正则表达式问题在PHP

我需要一个正则表达式解决方案可以处理嵌套的情况下

+12

嗯,哦......你刚刚在一个问题中写了一些HTML,然后用'regex'标记它? (见http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2010-01-07 10:00:38

+9

这里是扎尔戈,又名托尼小马。我们都是doooomed – gnud 2010-01-07 11:17:26

回答

2

This总结起来不错。

总之,不要使用正则表达式来解析HTML。相反,看看DOM类,特别是DOMDocument::loadHTML

+0

我想用正则表达式 – user198729 2010-01-07 10:01:16

+7

不,你真的真的真的没有。 – 2010-01-07 10:02:15

+1

@unknown(谷歌):为什么?为什么你会选择更容易出错的解决方案,而你可以使用类似karim79的内容? – 2010-01-07 10:12:38

0

这里是使用字符串方法

$str= <<<A 
blah 
<div class="begin"> 
blah blah 
blah 
blah blah </div> 
blah 
A; 

$s = explode("</div>",$str); 
foreach($s as $k=>$v){ 
    $m=strpos($v,'<div class="begin">'); 
    if($m !==FALSE){ 
     echo substr("$v" ,$m); 
    } 
} 

输出

$ php test.php 
<div class="begin"> 
blah blah 
blah 
blah blah 
11

使用DOM和DOMXPath,而不是正则表达式的一种方式,你会感谢我的:

// something useful: 
function dumpDomNode ($node) { 
    $temp = new DOMDocument(); 
    $temp->appendChild($node,true); 
    return $temp->saveHTML(); 
} 

$dom = new DOMDocument(); 
$dom->loadHTML($html_string); 

$xpath-> new DOMXpath($dom); 

$elements = $xpath->query("*/div/[@class='begin']"); 

foreach ($elements as $el) { 
    echo dumpDomNode($el); // <-- or do something more useful with it 
} 

用正则表达式的尝试,这将导致你的路径,疯狂......

2

这里是你的正则表达式:

preg_match('/<div class=\"begin\">.*<\/div>/simU', $string, $matches); 

但是:

  • 正则表达式不知道什么是XML/HTML元素。对他们来说,HTML只是一个字符串。这就是为什么其他人正确。正则表达式是不适用于解析 a DOM。它们用于查找字符串模式
  • 我所提供的正则表达式,因为你不打算解析整个HTML页面,但只要抓住一个定义件文本从它,在这种情况下,正则表达式是好的使用的。
  • 如果在DIV内部存在嵌套的DIV,则正则表达式将无法按预期工作。如果是这种情况,请不要使用正则表达式。使用其他解决方案之一,因为那么你需要DOM解析,而不是字符串匹配。
  • 对于查找具有或多或少明确定义的开始和结束的字符串,请考虑使用常规字符串函数,因为它们通常更快。