php - 查找 HTML 中最里面的文本

标签 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>

我认为应该类似于 >(.*?)<但前面和后面的所有字符都必须被忽略。


更新以允许 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/

相关文章:

html - 如何使用 Bootstrap 对齐图标旁边的文本?

javascript - 无法获得 while 循环工作(崩溃页面)

regex - VS Code 多行搜索和替换 HTML/XML 标签?

regex - 解码正则表达式以了解它是否仅允许数字

php - 摆脱 CodeIgniter URL 中的 Index.php

javascript - 单选按钮显示和隐藏 div 的下一个/上一个按钮

php - Laravel Homestead 无法连接到数据库

Python使用正则表达式递归替换字符串

php - 从具有特定时区和特定 $now 值的相对日期/时间字符串获取时间戳

php - 取消链接但文件日期大小保留在新文件上