PHP 使用重叠的正则表达式替换字符串

标签 php regex string preg-replace overlapping

如何使用重叠的正则表达式替换字符串?

您好!我正在尝试将 html 标签添加到字符串中。我正在使用函数 preg_replace(),但是当我在数组中的模式重叠时,preg_replace 不起作用。

$string = 'abc';
$patterns[0] = '/a/';
$patterns[1] = '/abc/';
$replacements[0] = '<b>$0</b>';
$replacements[1] = '<i>$0</i>';
echo preg_replace($patterns, $replacements, $string);

这会产生以下输出:

<b>a</b>bc

但我期待这样的输出:

<b><i>a</b>bc</i>

似乎 preg_replace 采用第一个模式并将其替换为第一个替换,然后搜索第二个模式,但它搜索的是 modified 字符串。 我必须使用支持正则表达式的函数。

最佳答案

因为它们不是同时运行,而是循环运行。在第一次表达之后,你最终得到 <b>a</b>bc所以没有更多的abc用于匹配第二个表达式。

就是这么简单。这很好,因为有了它,您不会以无效标记结束。你会。正则表达式是 HTML 或 XML 的严重问题。

使用一些 DOM 解释器和库,比如 PHP 的 DOMDocument

关于PHP 使用重叠的正则表达式替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767531/

相关文章:

php - Fwrite() 和 Fread() 与 Mysql 数据库

php - 清除magento中的所有catalog_product_flat表

regex - Perl 正则表达式、单词 anchor 和特殊字符

sql - 甲骨文 SQL : Regexp_substr

Javascript:切片和子字符串未按预期工作

Python : Comparing two times, 并在几分钟内返回

c - 如何分离一个数组并将其存储到一个新数组中?

php - 隐藏 file.php?id=12345 .htaccess 未应用

php - 如何用 PHP 解析大的 JSON 文件

javascript - 为什么以下正则表达式不删除 ## 字符?