文字を一度だけ置き換えたい場合は、次の正規表現が機能するはずです。
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
注: 元の問題はすでに何度も変更されていると思いますので、この問題をこれ以上複雑にしないでください。別のクエリがある場合は、自由に別の質問を投稿できます。