0

嗨,我正在使用这个正则表达式来获取测试中的文本

<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 ONLY来提取 div 标签之间的文本。只能使用正则表达式:(。

请帮忙

谢谢....

4

4 回答 4

4

我强烈推荐一个 HTML 解析器,让自己免于尝试编写正则表达式来解析 HTML/XML 的永无止境的痛苦

于 2012-08-01T13:20:08.440 回答
1

我建议您通过 xpath 获取该 DOM 元素,该元素的 xpath 表达式为:

//div[@class="testing"]

所有这些都可以通过 PHP DOMDocument 扩展或 SimpleXML 扩展来完成。两者都在 99.9% 中使用 PHP,与正则表达式扩展相同,一些粗略的示例代码(演示):

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 表达式是如何工作的。

于 2012-08-01T13:31:26.333 回答
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. 我不知道...在更多情况下这可能会失败

我可以尝试编写一个更复杂的正则表达式,但我不认为我能想出比这更好的东西。此外,当您使用 PHP 内置的其他工具可以更好地解析 HTML 时,这似乎是在浪费时间。

于 2012-08-01T13:34:22.027 回答
0

我不知道您是否仍然需要这个,但下面的 RegEx 适用于您问题中的所有给定场景。

(!?(<.*?>)|[^<]+)\s*

https://regex101.com/r/DAObw0/1

可以通过以下方式访问匹配组:

const [_, group1, group2] = myRegex.Exec(input)
于 2021-12-29T10:57:13.310 回答