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);