如何在id属性之前获取包含类,样式等属性的div标记之间的文本。我需要使用正则表达式

时间:2012-08-01 13:14:04

标签: php html regex

您好我正在使用此正则表达式来获取测试中的文本

<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标签之间的文本。必须只使用正则表达式:(。

请帮助

谢谢....

3 个答案:

答案 0 :(得分:4)

答案 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\>)/';

<强>声明 绝不保证这将适用于所有情况(远离它)。事实上,如果出现以下情况,则会失败:

  1. id="test"不是最后一个标记属性
  2. 如果id="test"与结束>之间有空格(或任何内容)。
  3. 如果div标签未正确关闭</div>
  4. 如果标签是用大写字母写的
  5. 如果标签属性是用大写字母写的
  6. 我不知道......在更多情况下这可能会失败
  7. 我可以尝试写一个更复杂的正则表达式,但我不认为我能想出比这更好的东西。此外,当您使用PHP构建的其他工具可以更好地解析HTML时,这似乎是浪费时间。