20

$data包含制表符、前导空格和多个空格。我希望用空格替换所有选项卡。多个空格与一个空格,并删除前导空格。

事实上,这会变成输入数据:

[    asdf asdf     asdf           asdf   ] 

进入输出数据:

[asdf asdf asdf asdf]

我该怎么做呢?

4

9 回答 9

20

用单个空格修剪、替换制表符和多余的空格:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
于 2009-07-25T08:29:34.033 回答
16
$data = trim(preg_replace('/\s+/g', '', $data));
于 2009-07-25T08:12:16.470 回答
4

假设方括号不是字符串的一部分,并且您只是将它们用于说明目的,那么:

$new_string = trim(preg_replace('!\s+!', ' ', $old_string));

您可能可以使用单个正则表达式来做到这一点,但这将是一个相当复杂的正则表达式。上面的内容要简单得多。

注意:我还假设您不想用“AB CD”替换“AB\t\tCD”(\t 是一个制表符)。

于 2009-07-25T08:19:07.877 回答
2
$data = trim($data);

这摆脱了您的前导(和尾随)空格。

$pattern = '/\s+/';
$data = preg_replace($pattern, ' ', $data);

这会将一个或多个空间的任何集合变成一个空间。

$data = str_replace("\t", " ", $data);

这摆脱了你的标签。

于 2009-07-25T08:18:29.827 回答
2
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));
于 2009-07-25T08:22:07.587 回答
0

这个答案完全从字面上理解了这个问题:它只关心空格和制表符。诚然,OP可能还希望在修剪/压缩的内容中包含其他类型的空白,但让我们假设他想要保留嵌入CR和/或LF.

首先,让我们设置一些常量。如果需要进行修改,这将便于理解和维护。我放置了一些额外的空格,以便您可以更轻松地比较异同。

define( 'S', '[ \t]+'      ); # Stuff you want to compress; in this case ONLY spaces/tabs
define( 'L', '/\A'.S.'/'   ); # stuff on the Left edge will be trimmed
define( 'M',   '/'.S.'/'   ); # stuff in the Middle will be compressed
define( 'R',   '/'.S.'\Z/' ); # stuff on the Right edge will be trimmed
define( 'T', ' '           ); # what we want the stuff compressed To

我们使用\A\Z 转义字符来指定主题的开始和结束,而不是典型的^$面向行的元字符。这与其说是因为在这种情况下需要它们,不如说是“防御性”编程,如果S改变的价值使它们在未来被需要的话。

现在是秘诀:我们将利用preg_replace的一些特殊语义,即(强调添加)

如果替换数组中的元素少于模式数组中的元素,则任何多余的模式都将被空字符串替换。

function trim_press( $data ){
    return preg_replace( [ M, L, R ], [ T ], $data );
}

因此,我们使用的是模式数组和替换数组,而不是模式字符串和替换字符串,这会导致额外的模式L并被R修剪。

于 2017-10-03T22:36:37.263 回答
0

如果您也需要删除 

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));
于 2018-02-04T02:48:03.190 回答
0

经过很多挫折后,我发现这是最好的解决方案,因为它还删除了可能是两个字符长的非中断空格:

$data = html_entity_decode(str_replace(' ',' ',htmlentities($data))); $data = trim(preg_replace('/\h/', ' ', $data));// 替换比 \s 更多的空格字符类型

比利诺亚

于 2020-01-10T12:22:46.027 回答
-1

只需使用这个正则表达式

$str = trim(preg_replace('/\s\s+/', ' ', $str));

它会将所有制表符和空格替换为一个空格,

这里 sign +in regex 表示一次或多次,pattern 表示,凡有两个或多个空格的地方,用一个空格替换

于 2012-11-02T15:04:52.733 回答