使用preg_replace匹配重复的空格

jje*_*ton 3 php regex wordpress

我正在编写一个WordPress插件,其中一个功能是删除重复的空格.

我的代码看起来像这样:

return preg_replace('/\s\s+/u', ' ', $text, -1, $count);
Run Code Online (Sandbox Code Playgroud)
  • 我不明白为什么我需要u 修饰符.我见过其他使用preg_replace但不需要为Unicode修改它的插件.我相信我有一个WordPress的默认安装.

  • 如果没有修饰符,代码将使用Unicode替换字形而不是空格替换所有空格.

  • 使用u修饰符,我没有得到字形,并且它不会替换所有空格.

下面的每个空间都有1-10个空格.正则表达式仅从每个组中移除空间.

之前:

This sentence  has extra space.  This doesn’t.  Extra  space, Lots          of extra space.
Run Code Online (Sandbox Code Playgroud)

后:

This sentence has extra space. This doesn’t. Extra space, Lots         of extra space.
Run Code Online (Sandbox Code Playgroud)

$count = 9

如何让正则表达式替换整个匹配的空间?


更新:如果我尝试使用常规php,它可以正常工作

$new_text = preg_replace('/\s\s+/', ' ', $text, -1, $count);
Run Code Online (Sandbox Code Playgroud)

它只在我在wordpress插件中使用它时才会中断.我在过滤器中使用此功能:

function jje_test( $text ) {
    $new_text = preg_replace('/\s\s+/', ' ', $text, -1, $count);
    echo "Count: $count";
    return $new_text;
}

add_filter('the_content', 'jje_test');
Run Code Online (Sandbox Code Playgroud)

我试过了:

  • 删除the_content上的所有其他过滤器
    remove_all_filters('the_content');
  • 更改添加到the_content的过滤器的优先级,更早或更晚
  • 各种排列\s+, \s\s+, [ ]+
  • 即使用空字符串替换所有单个空格,也不会替换空格

Jan*_*rts 6

这将使用单个空格替换两个或多个空格,制表符和/或换行符的所有序列:

return preg_replace('/[\p{Z}\s]{2,}/u', ' ', $text);
Run Code Online (Sandbox Code Playgroud)

/u如果$text保存文本编码为UTF-8,则需要该标志.即使正则表达式中没有Unicode字符,PCRE也必须$text正确解释.

我添加\p{Z}到字符类中是因为PCRE仅在使用短字符时才匹配ASCII字符\s,即使在使用时也是如此/u.添加\p{Z}可确保匹配所有Unicode空格.可能还有其他空格,例如字符串中的不间断空格.

我不确定echo在WordPress过滤器中使用是否是一个好主意.