如果您只想替换一个字母一次,那么下面的正则表达式应该可以工作:
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的评论:
Can you help me allow more than one a then? How can I match 2, but not 3 a's
我发布这个答案:
echo strrev(preg_replace('/([aeiou])(?!(.+?\\1){2})/',
strrev('<i>1$</i>'), strrev('alphabetax'))) . "\n";
编辑 3:
根据OP的另一条评论:
that will allow duplicates for all characters in the string, not just 2 a's & 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
注意:我相信原始问题已经改变了很多次,所以请不要在这个问题中增加进一步的复杂性。如果您有不同的疑问,您可以自由发布另一个问题。