php - 如何使 preg_replace 仅替换匹配的*每个*字符中的第一个?

标签 php regex string preg-replace

例如,以下代码用 <i> 包装每个匹配字符。标签。

echo preg_replace('/[aeiou]/', '<i>$0</i>', 'alphabet');
// result: <i>a</i>lph<i>a</i>b<i>e</i>t

但我希望它只替换每个字符一次。

我正在寻找类似 <i>a</i>lphab<i>e</i>t 的结果,其中第二个a无需标签即可通过,因为搜索字符串只有一个 a .

你能帮忙吗?这是否可以在不迭代 foreach 循环中的每个字符的情况下实现?

答案还应该允许使用两个或多个相同的字符,每个字符只能使用一次。例如,如果我正在搜索 aaeioo在字符串 alphabetsoupisgood 中,它应该匹配 a但这只是三个中的两个o的。

最佳答案

如果您只想替换一个字母一次,那么以下正则表达式应该有效:

echo preg_replace('/([aeiou])(?!.+?\\1)/', '<i>$1</i>', 'alphabet');

输出:

alph<i>a</i>b<i>e</i>t

PS:请注意,它会替换最后一次出现的字母,而不是第一个字母。

编辑:

以下将产生与OP预期相同的输出(感谢@AntonyHatchkins):

echo strrev(preg_replace
        ('/([aeiou])(?!.+?\\1)/', strrev('<i>1$</i>'), strrev('alphabet')))."\n";

编辑2:

根据OP的评论:

你能帮我允许多个 a 吗?如何匹配 2 个而不是 3 个 a

我发布这个答案:

echo strrev(preg_replace('/([aeiou])(?!(.+?\\1){2})/', 
            strrev('<i>1$</i>'), strrev('alphabetax'))) . "\n";

编辑3:

根据另一位OP的评论:

这将允许字符串中的所有字符出现重复,而不仅仅是 2 个 a 和 1 个 e

我发布这个答案:

echo strrev(preg_replace(array('/(a)(?!(.+?\\1){2})/', 
  '/(?<!>)([eiou])(?!.+?\\1)/'), 
  array(strrev('<i>1$</i>'), strrev('<i>1$</i>')), strrev('alphabetaxen')))."\n";

输出:

<i>a</i>lph<i>a</i>b<i>e</i>taxen

注意:我相信原始问题已经改变了很多次,所以请不要增加这个问题的进一步复杂性。如果您有不同的疑问,您可以随时发布另一个问题。

关于php - 如何使 preg_replace 仅替换匹配的*每个*字符中的第一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132492/

相关文章:

javascript - 正则表达式中的条件逻辑

javascript - 匹配任何不以 .json 结尾的正则表达式

r - 根据另一列中的初始字符串添加列值

string - 将 http 响应压缩为字符串的精确副本

Python while循环返回第N个字母

php - 在 Laravel 5 中更新时验证唯一的 Slug

javascript - 使用ajax显示php数据json_encoded

python - python 上的简单正则表达式

php - 如何将 SQL 查询格式化为更易于阅读的格式?

php - laravel php7 debian 7.5站点部署有非法字符,不知道为什么