使用preg_replace匹配重复的空格

时间:2010-06-29 01:42:32

标签: php regex wordpress

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

我的代码如下所示:

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

  • 没有修饰符,代码 用Unicode替换所有空格 替换字形而不是空格。

  • 使用This sentence has extra space. This doesn’t. Extra space, Lots of extra space. 修饰符,我无法得到 字形,它不会取代所有的空格。

以下每个空间都有1-10个空格。正则表达式只删除每个组的空间。

之前:

This sentence has extra space. This doesn’t. Extra space, Lots         of extra space.

之后:

$count

$new_text = preg_replace('/\s\s+/', ' ', $text, -1, $count); = 9

如何让正则表达式用一个空格替换整个匹配?

<小时/> 更新:如果我使用常规php尝试此操作,它可以正常工作

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

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

remove_all_filters('the_content');

我试过了:

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

5 个答案:

答案 0 :(得分:6)

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

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

如果/u包含编码为UTF-8的文本,则需要$text标记。即使正则表达式中没有Unicode字符,PCRE也必须正确解释$text

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

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

答案 1 :(得分:2)

u修饰符只是将其置于UTF-8模式,如果您需要对代码点高于0x7f的字符执行任何特定操作,这将非常有用。您仍然可以使用UTF-8编码的字符串而不使用该修饰符,您将无法轻松地专门匹配或转换此类字符。

Unicode中有一些空白字符高于0x7f。在大多数数据中遇到它们非常罕见。但是你可能会看到,例如,一个不间断的空格字符,它是unicode \ uA0,或者是一些罕见的字符。

我不知道为什么使用它会导致输出Unicode“替换”字形。我会说在其他地方会出现问题......你输出的脚本是什么字符编码?

答案 2 :(得分:2)

要在我的第一个回复的评论中回答jjeaton的后续问题,以下内容将该序列中的第一个字符替换为空格,制表符和/或换行符的每个序列。实际上,这将删除两个或多个空白字符的每个序列中的第二个和后面的空白字符。一行空格被替换为单个空格,一行选项卡被替换为单个选项卡等。一个空格和一个选项卡(按此顺序)的运行被替换为空格,并运行一个选项卡和用标签等替换空格

return preg_replace('/([\p{Z}\s])[\p{Z}\s]+/u', '$1', $text);

此正则表达式首先匹配一个空格并使用捕获组捕获它,然后是一个或多个空格。替换文本只是重新插入与第一个(也是唯一的)捕获组匹配的文本。

答案 3 :(得分:0)

不知道任何修饰符,但这样做了诀窍:

<?php
$text = ' Hi,   my name is    Andrés.  ';
echo preg_replace(array('/^\s+/', '/\s+$/', '/\s{2,}/'), ' ', $text);
/*
Hi, my name is Andrés.
*/
?>

答案 4 :(得分:0)

preg_replace('!\s+!', ' ', 'This sentence  has extra space.  This doesn’t.  Extra  space, Lots          of extra space.');