PHP preg_replace跳过匹配重叠的地方


PHP preg_replace skipping where match overlaps

我整个下午都在谷歌上搜索这个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"的单字母字符都已删除。

您可以使用环视。它们是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)

你可以试试这个:

/(?<='s)[b-hj-zB-HJ-Z](?='s)/

或者如果不需要CCD_ 3和CCD_。

您可以使用这个:

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

注意:我不使用空格来分隔单个字母,而是使用单词边界,即[a-zA-Z0-9_]中的一个字符和另一个字符之间的零宽度限制。这比空格更通用,包括(例如)标点符号。