我正在尝试使用正则表达式从我的许多网站文件中获取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中没有使用它们?
(在网站上快速写出来,看它是否有效)
答案 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的内容可以跨越几行。