您好我正在使用此正则表达式来获取测试中的文本
<div id = "test">text</div>
$regex = "#\<div id=\"test\"\>(.+?)\<\/div\>#s";
但如果情况发生变化,例如
<div class="testing" style="color:red" .... more attributes and id="test">text</div>
或
<div class="testing" ...some attributes... id="test".... some attributes....>text</div>
或
<div id="test" .........any number of attributes>text</div>
那么上面的正则表达式将无法在div标签之间提取文本。在第一种情况下,如果在div标签的id属性前面放置了更多属性,即id属性是上一个正则表达式不起作用的最后一个属性。在第二种情况下,id属性在某些属性之间,在第三种情况下,它是div标签的第一个属性。 我是否可以使用符合上述3个条件的正则表达式,以便通过仅指定ID 来提取div标签之间的文本。必须只使用正则表达式:(。
请帮助
谢谢....
答案 0 :(得分:4)
我强烈建议an HTML parser让自己免于never-ending grief of trying to write a regular expression to parse HTML/XML。
答案 1 :(得分:1)
我建议您通过xpath获取该DOM元素,该元素的xpath表达式为:
//div[@class="testing"]
所有这些都可以通过PHP DOMDocument扩展或使用SimpleXML扩展来完成。两者都使用PHP发送99.9%,与正则表达式扩展相同,一些粗略的示例代码(demo):
echo simplexml_import_dom(@DOMDocument::loadHTML($html))
->xpath('//div[@class="testing"]')[0];
Xpath是一种用于查询XML文档中的元素和数据的专用语言,其中正则表达式是更简单字符串的语言。
修改: ID相同:http://codepad.viper-7.com/h1FlO0
//div[@id="test"]
我想你很快就能理解这些简单的xpath表达式是如何工作的。
答案 2 :(得分:1)
这里是DOM的答案(有点肮脏但有效)
$aPieceOfHTML = '<div class="testing" id="test" style="color:red">This is my text blabla<div>';
$doc = new DOMDocument();
$doc->loadHTML($aPieceOfHTML);
$div = $doc->getElementsByTagName("div");
$mytext = $div->item(0)->nodeValue;
echo $mytext;
这是克苏鲁的方式:
$regex = '/(?<=id\=\"test\"\>).*(?=\<\/div\>)/';
<强>声明强> 绝不保证这将适用于所有情况(远离它)。事实上,如果出现以下情况,则会失败:
id="test"
不是最后一个标记属性id="test"
与结束>
之间有空格(或任何内容)。</div>
我可以尝试写一个更复杂的正则表达式,但我不认为我能想出比这更好的东西。此外,当您使用PHP构建的其他工具可以更好地解析HTML时,这似乎是浪费时间。