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>
我认为应该类似于 >(.*?)<
但前面和后面的所有字符都必须被忽略。
更新以允许 Wiktor Stribiżew 的增强答案:
另一项任务是用另一个字符串替换找到的字符串。这可能会导致另一种模式,因为它只是查找并获取最里面的字符串 - 不确定。
最佳答案
您似乎知道在 HTML 中使用正则表达式时可能会遇到的问题,因此请将正则表达式答案作为学习练习,并在生产中使用 DOM 解析如果您必须将其与任意 HTML 代码一起使用.
恕我直言,如果您知道自己在做什么,也就是说,您可以完全控制生成的 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
替换文本。
关于php - 查找 HTML 中最里面的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608812/