Php 使用preg_replace匹配重复空格
我正在写一个WordPress插件,其中一个功能是删除重复的空白 我的代码如下所示:Php 使用preg_replace匹配重复空格,php,regex,wordpress,Php,Regex,Wordpress,我正在写一个WordPress插件,其中一个功能是删除重复的空白 我的代码如下所示: return preg_replace('/\s\s+/u', ' ', $text, -1, $count); 我不明白为什么我需要u 修饰语。我见过其他插件 使用preg\u replace而不使用 需要为Unicode修改它。我 相信我有一个默认安装 WordPress的 如果没有修饰符,代码 用Unicode替换所有空格 替换图示符而不是空格 使用u修饰符,我不明白 字形,它不会替换所有的空白 下
return preg_replace('/\s\s+/u', ' ', $text, -1, $count);
- 我不明白为什么我需要
修饰语。我见过其他插件 使用u
而不使用 需要为Unicode修改它。我 相信我有一个默认安装 WordPress的preg\u replace
- 如果没有修饰符,代码 用Unicode替换所有空格 替换图示符而不是空格
- 使用
修饰符,我不明白 字形,它不会替换所有的空白u
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');
我试过:
- 删除\u内容上的所有其他筛选器
删除所有过滤器(“内容”)代码>
- 更改添加到_内容的筛选器的优先级(更早或更晚)
等的各种排列\s+、\s\s+、[]+
- 即使用空字符串替换所有单个空格,也不会替换空格
我不知道为什么使用它会导致输出Unicode“替换”字形。我会说这在其他地方是个问题。。。您将脚本输出为什么字符编码?不知道任何修饰符,但这确实起到了作用:
<?php
$text = ' Hi, my name is Andrés. ';
echo preg_replace(array('/^\s+/', '/\s+$/', '/\s{2,}/'), ' ', $text);
/*
Hi, my name is Andrés.
*/
?>
这将用一个空格替换两个或更多空格、制表符和/或换行符的所有序列:
return preg_replace('/[\p{Z}\s]{2,}/u', ' ', $text);
如果$text
保存编码为UTF-8的文本,则需要/u
标志。即使正则表达式中没有Unicode字符,PCRE也必须正确解释$text
我在字符类中添加了\p{Z}
,因为即使使用/u
,PCRE在使用诸如\s
之类的速记时也只匹配ASCII字符。添加\p{Z}
可确保所有Unicode空格都匹配。字符串中可能还有其他空格,例如非中断空格
我不确定在WordPress过滤器中使用
echo
是否是一个好主意。要回答jjeaton在我第一次回复的评论中提出的后续问题,以下内容将用该序列中的第一个字符替换空格、制表符和/或换行符的每个序列。实际上,这会删除两个或多个空格字符序列中的第二个和后面的空格字符。一段空格替换为一个空格,一段制表符替换为一个制表符,等等。一段空格和一个制表符(按该顺序)替换为一个空格,一段制表符和一个空格替换为一个制表符,等等
return preg_replace('/([\p{Z}\s])[\p{Z}\s]+/u', '$1', $text);
这个正则表达式的工作原理是首先匹配一个空间并用一个捕获组捕获它,然后是一个或多个空间。替换文本只是重新插入与第一个(也是唯一一个)捕获组匹配的文本。不幸的是,对我来说仍然不起作用。我也尝试过使用
/\s{2,}/
,但它对我来说并不匹配。也许我的wordpress/php设置有问题?你从哪里获取文本?让我更具体一点:你应该让php知道你正在从数据库发送和检索什么。在任何连接之后和任何查询之前,您应该声明msyql\u set\u字符集('utf8',$connection\u resource);内容类型标题设置为charset=UTF-8
,mysql数据库排序规则设置为utf8\u general\u ci,wordpress本身的读取设置设置为UTF-8。所以我真的不明白一个规则的空格字符是如何被这样解释的。我并没有什么奇怪的数据来源。我自己输入了数据。也许你可以在网上的某个地方发布一个工作演示-有人可能会看到它在做什么并帮助你。我在上面对这个问题的评论中有一个链接,指向一些示例代码和结果。我添加了一个示例,这里有结果的代码:我用R
代替了空格,这样可以更清楚地知道什么被替换了,什么没有被替换。我正在用WordPress安装一个新的LAMP,它似乎已经解决了unicode问题。这里有没有我错过的不使用正则表达式的解决方案?这很有效!非常感谢。我想知道这是否是不间断的空格,尽管我在HTML源代码中没有看到它们。我同意使用echo
它只是为了调试的目的,用来计算匹配的数量。我不明白的是,为什么在同一个数据库上运行的所有内置wordpress函数(总是默认为utf-8)都不必使用/u
标志。有关示例,请参见wp\u texturize()
函数:仅适用于ASCII字符(字节0到127)的正则表达式即使没有/u
,UTF-8也能在UTF-8字符串上正常工作,因为UTF-8专门设计为对只懂ASCII且忽略字节数>127的进程透明。根据您对HTML源代码的看法,您可能无法“看到”非中断空格,因为它们看起来就像普通空格。我理解,然而,他们的一些
return preg_replace('/([\p{Z}\s])[\p{Z}\s]+/u', '$1', $text);