例如,以下代码用 <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/