PHP preg_replace跳过匹配重叠的地方

时间:2013-07-30 22:01:35

标签: php regex

我整个下午一直在谷歌搜索这种正则表达式行为。

$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”的单字母字符均已删除。

3 个答案:

答案 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)/
如果您不同时需要iI,请

或修改范围。

答案 2 :(得分:0)

您可以使用:

echo preg_replace('~(?i)\b[B-HJ-Z]\b~', ' ', $str);

注意:我不使用空格来分隔单个字母,而是使用字边界,这是{​​{1}}字符和另一个字符之间的零宽度限制。这比空格更通用,包括(例如)标点符号。