2010-06-29 100 views
3

我正在写一个WordPress插件,其中一个功能是删除重复的空格。用preg_replace匹配重复的空格

我的代码如下所示:

return preg_replace('/\s\s+/u', ' ', $text, -1, $count); 
  • 我不明白为什么我需要的u 修改。我已经看到其他插件 使用preg_replace而不是 需要修改它的Unicode。我相信我有一个WordPress的默认安装 。

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

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

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

前:

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

后:

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

$count = 9

我怎样才能让正则表达式替换整场比赛用一个空间?


更新:如果我尝试这与普通的PHP,它工作正常

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

,当我在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'); 

我曾尝试:

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

我已经添加了一个例子,代码的结果在这里:http://pastebin.com/hm2JMX2w我用'R'代替了空格,所以它会更清楚什么被替换,什么是'吨。我正在使用WordPress的LAMP新安装,似乎解决了unicode问题。 – jjeaton 2010-07-09 04:18:11

+0

有没有另一种解决方案,我错过了,不使用正则表达式? – jjeaton 2010-07-09 23:19:12

回答

6

这将替换两个或多个空格,制表符的所有序列,和/或符合空单突破:

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

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

我将\p{Z}添加到字符类,因为当使用短符号(如\s,即使使用/u)时,PCRE只匹配ASCII字符。添加\p{Z}可确保所有Unicode空白符合匹配。可能还有其他空间,例如字符串中的非空白空格。

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

+0

这工作!谢谢!我想知道这是不是空格,尽管我没有在HTML源代码中看到它们。我同意使用'echo',它只是出于调试的目的来计算匹配次数。我不明白的是,为什么所有在同一数据库上运行的内置wordpress函数(总是默认为utf-8)不必使用'/ u'标志。例如,请参阅'wp_texturize()'函数:http://wordpress.taragana.net/wp-includes/formatting.php.source.html#l3 – jjeaton 2010-07-14 02:06:59

+0

只适用于ASCII字符的正则表达式(字节0到127)即使没有'/ u'也可以在UTF-8字符串上正常工作,因为UTF-8被专门设计为对只理解ASCII并且忽略大于127的字节的进程是透明的。 – 2010-07-14 03:01:42

+0

根据你对HTML源代码的看法,你可能不会“看到”不间断的空间,因为它们看起来就像普通空间一样。 – 2010-07-14 03:03:10

2

u修改只是把它变成UTF-8模式下,如果你需要做具体的事情与具有代码字符,这是非常有用的指向0x7f以上。您仍然可以使用UTF-8编码的字符串而不使用该修饰符,但您将无法轻松地专门匹配或转换此类字符。

Unicode中有一些空白字符在0x7f以上。在大多数数据中遇到它们是非常罕见的。但是,例如,您可能会看到一个非破坏性空格字符,它是unicode \ uA0或一些较罕见的字符。

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

+0

内容类型标头设置为“charset = UTF-8”,mysql数据库排序规则设置为utf8_general_ci,wordpress自身的阅读设置设置为UTF-8。所以我真的不明白一个正规的空间角色是如何被这样解释的。这不像我有一些奇怪的数据源。我自己输入了数据。 – jjeaton 2010-06-30 03:01:30

+0

也许你可以在网上发布一个工作演示 - 有人可能会看到它在做什么,并帮助你。 – thomasrutter 2010-07-01 00:21:16

+0

我对这个问题的评论有一个链接,带有结果的示例代码。 – jjeaton 2010-07-09 04:18:59

0

不知道任何修饰,但是这并获得成功:

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

不幸的是,仍然不适合我。我也尝试过使用'/ \ s {2,} /',并且它与我的任何内容都不匹配。也许我的wordpress/php安装有问题吗? – jjeaton 2010-06-30 02:50:12

+0

你从哪里得到你的文本? – misterte 2010-06-30 16:48:45

+0

让我更具体: 哟应该让PHP知道'你是什么'发送和检索数据库。在任何连接之后,在任何查询之前,您应该声明msyql_set_charset('utf8',$ connection_resource); – misterte 2010-06-30 21:34:54

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

这也不起作用。 – jjeaton 2010-06-30 03:02:57

2

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

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

此正则表达式的工作方式是第一匹配的一个空间,并用一个捕获组,后面是一个或多个空格捕获它。替换文本只是重新插入第一个(也是唯一)捕获组匹配的文本。