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替换找到的字符串。这可能导致另一种模式,因为它只是找到并获得最内部的字符串 - 不确定。
答案 0 :(得分:2)
答案 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 demo和regex 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)
试试这个:
>((?:(?!<).)+?)<\/
试过:
<a>XXX1</a>
<a some-attr="bla" some-attr2="bla2"><b>XXX2</b></a>
<a> bla <b>XXX3</b></a>
每行的捕获组包含:
XXX1
XXX2
XXX3