Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_替换匹配重叠处的跳过_Php_Regex - Fatal编程技术网

PHP preg_替换匹配重叠处的跳过

PHP preg_替换匹配重叠处的跳过,php,regex,Php,Regex,整个下午我都在谷歌上搜索这个正则表达式 $str = ' b c d w i e f g h this string'; echo preg_replace('/\s[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ]{1}\s/', ' ', $str); 我想删除单个字符的所有实例,除了a和I之外,并在其位置保留一个空格。此代码似乎适用于其他所有匹配项。我怀疑这是因为比赛互相重叠 我怀疑在这里使用lookaround是合适的,但我以前从未使

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

$str = ' b c d w i e f g h this string';

echo preg_replace('/\s[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ]{1}\s/', ' ', $str);
我想删除单个字符的所有实例,除了a和I之外,并在其位置保留一个空格。此代码似乎适用于其他所有匹配项。我怀疑这是因为比赛互相重叠

我怀疑在这里使用lookaround是合适的,但我以前从未使用过它们,可以使用一个片段

编辑: 只是为了避免对我正在努力完成的事情感到困惑。我想将上面的字符串转换为:

$str = ' i this string';
请注意,所有非A或I的单字母字符都已被删除。

您可以使用环视。它们是0长度匹配,因此不会占用空间。而且{1}真的很荒谬,你可以把它去掉

echo preg_replace('/(?<=\s)[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ](?=\s)/', '', $str)
或单词边界也将在此处起作用:

echo preg_replace('/(?i)\b[B-HJ-Z]\b/', '', $str)
您可以尝试以下方法:

/(?<=\s)[b-hj-zB-HJ-Z](?=\s)/
或者,如果您不需要同时使用i和i,请修改范围。

您可以使用:

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

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

感谢您指出范围。你误解了我想要实现的目标。英语中唯一的单字母单词是a和I。字符串中允许使用这些单词。任何其他单独存放的信件都需要去掉。你的解决方案除去了除I和A之外的所有东西。@Tanoro。好啊你可以用环顾四周。我会更新我的答案。@Tanoro。更新后的post.极好。这正是我所期望的,你的例子完全符合我的需要。@Tanoro:你的字母表中有H字母吗?@Tanoro这也忽略了H或H。@RohitJain:我不确定Tanoro是否会花时间阅读评论,因为他不会花时间阅读答案。我讨厌你上面暗示我不阅读答案。我不合适。至于你的解决方案,在我工作的具体项目中没有必要。字符串不会包含标点符号,所以用空格分隔就足够了。
echo preg_replace('~(?i)\b[B-HJ-Z]\b~', ' ', $str);