div的正则表达式不正确

时间:2014-05-29 10:31:16

标签: php regex

我正在尝试使用正则表达式从我的许多网站文件中获取div,但是我失败了 这就是我要做的事http://regexr.com/38to9

我需要以下div与类数据等,使用类plainText和extData实际上适合正则表达式,所有内容。在我列出的内容中没有额外的div 我现在坐在这里大约2个小时,我无法弄明白 对于那些不想去那个很酷的网站的人来说,这是以下内容

<div class="data">
    Something
</div>

<div class="data">
     Text in here
    <a class="data" href="links"><img src="whatever.png"></a>
</div>

使用正则表达式

\s*<div class="(data|plainText|extData)">\s*(...)\s*<\/div>

第一个div突出显示,第二个div不突出显示。使用php进行preg_match_all也无法获得任何结果。是否与我在第二个div中使用标签的事实有关,我在第一个div中没有​​使用它们?
(在网站上快速写出来,看它是否有效)

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用解析器?

$dom = new DOMDocument();
$dom->loadHTML($input);
$divs = $dom->getElementsByTagName('div');
foreach($divs as $div) {
  if( preg_match("/\b(data|plainText|extData)\b/",$div->getAttribute("class")) {
    // do something to the $div
    $div->setAttribute("title","I matched!");
  }
}
$out = $dom->saveHTML();

// Because DOMDocument wraps our HTML in a minimal document, we need to extract
// in this case, regex is okay because we have a known structure:
$out = preg_replace("~.*?<body>(.*)</body>.*~","$1",$out);

答案 1 :(得分:1)

你有一个很好的非正则表达式的答案,但你也应该知道你真的很接近......

关于使用正则表达式解析html的所有免责声明,将DOTALL修饰符(?s)添加到原始表达式中符合您的要求:

(?s)<div class="(data|plainText|extData)">\s*(.*?)\s*<\/div>

请参阅demo

这是如何运作的?

DOTALL修饰符(?s)告诉引擎点可以匹配换行符。这对您的(.*?)很重要,因为div的内容可以跨越几行。