-1

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

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

4

3 回答 3

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)
于 2013-07-30T22:03:30.253 回答
1

你可以试试这个:

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

或修改范围,如果您不需要两者iI

于 2013-07-30T22:11:53.760 回答
0

你可以使用这个:

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

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

于 2013-07-30T22:12:11.650 回答