在HTML中查找最里面的文本

时间:2016-11-15 11:32:58

标签: php html regex

PHP中用于查找HTML字符串最内层文本的正则表达式是什么? HTML元素的树只有一个假,只能有一系列分支。

结果为XXX的示例(这不是带有换行符的单个字符串;每行都会执行正则表达式):

<a>XXX</a>
<a some-attr="bla" some-attr2="bla2"><b>XXX</b></a>
<a>   bla   <b>XXX</b></a>

这不需要保留:

<a>XXX</a><a>XXX</a>
<a><</a>
<a>></a>

我认为应该是>(.*?)<之类的东西,但是前后的所有字符都必须被忽略。

已更新,以便更好地回答WiktorStribiżew:
另一个任务是用另一个用PHP替换找到的字符串。这可能导致另一种模式,因为它只是找到并获得最内部的字符串 - 不确定。

3 个答案:

答案 0 :(得分:2)

您可能会使用类似这样的内容

>([^><]+)<\/

它会匹配> </之间的所有内容,而不是><

Example

答案 1 :(得分:2)

您似乎知道在使用带有HTML的正则表达式时可能遇到的问题,因此请将正则表达式的答案作为学习练习并在生产中使用DOM解析,如果您必须使用任意HTML代码< / em>的

恕我直言,如果您知道自己在做什么,也就是说,您可以完全控制生成的HTML,并且您知道所有<都被序列化为HTML实体并且所有标签都包含在内对于字母数字/下划线字符,您可以使用正则表达式:

$html = <<<DATA
<a>XXX</a>
<a some-attr="bla" some-attr2="bla2"><b>XXX</b></a>
<a>   bla   <b>XXX</b></a>
DATA;
echo preg_replace('~(<(\w+)[^<]*?>)[^<]*(<\/\2>)~', '$1YYY$3', $html);

请参阅PHP demoregex demo

结果是内部没有标签的标签内的所有文本都被替换为YYY

<a>YYY</a>
<a some-attr="bla" some-attr2="bla2"><b>YYY</b></a>
<a>   bla   <b>YYY</b></a>

<强>详情:

  • (<(\w+)[^<]*?>) - 第1组捕获<,然后捕获到第2组(我们可以在结束标记中匹配相同标记名称的技术组)1个或多个字符,然后除<之外的任何0 +字符尽可能少(带有否定的字符类[^<]和惰性量词*?
  • [^<]* - 文字内容:<以外的零个或多个字符,尽可能多
  • (<\/\2>) - 第3组:</,与第2组相同的文字(标记名称)和>

在替换中,我们只使用$1$3反向引用第1组和第3组,将捕获的文本重新插入这些组,并添加YYY替换文字。

答案 2 :(得分:1)

试试这个:

>((?:(?!<).)+?)<\/

Explanation

试过:

<a>XXX1</a>
<a some-attr="bla" some-attr2="bla2"><b>XXX2</b></a>
<a>   bla   <b>XXX3</b></a>

每行的捕获组包含:

XXX1
XXX2
XXX3