我整个下午一直在谷歌搜索这种正则表达式行为。
$str = ' b c d w i e f g h this string';
echo preg_replace('/\s[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ]{1}\s/', ' ', $str);
我想自己删除单个字符的所有实例(A和I除外)并在其位置留下一个空格。此代码似乎适用于其他所有匹配项。我怀疑这是因为比赛相互重叠。
我怀疑在这里看起来很合适,但我以前从未使用它们并且可以使用代码段。
编辑: 只是为了避免混淆我想要完成的事情。我想把上面的字符串转换成这个:
$str = ' i this string';
请注意,所有非“A”或“I”的单字母字符均已删除。
答案 0 :(得分:2)
您可以改用环视。它们是0长度匹配,因此不会占用空间。而{1}
在那里真的很荒谬,你可以删除它。
echo preg_replace('/(?<=\s)[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ](?=\s)/', '', $str)
您可以在此处使用范围和不区分大小写的标记(?i)
,以减少键入所有这些字符的痛苦:
echo preg_replace('/(?i)(?<=\s)[B-HJ-Z](?=\s)/', '', $str)
或字边界也适用于此:
echo preg_replace('/(?i)\b[B-HJ-Z]\b/', '', $str)
答案 1 :(得分:1)
你可以试试这个:
/(?<=\s)[b-hj-zB-HJ-Z](?=\s)/
如果您不同时需要i
和I
,请或修改范围。
答案 2 :(得分:0)
您可以使用:
echo preg_replace('~(?i)\b[B-HJ-Z]\b~', ' ', $str);
注意:我不使用空格来分隔单个字母,而是使用字边界,这是{{1}}字符和另一个字符之间的零宽度限制。这比空格更通用,包括(例如)标点符号。