$data
包含制表符、前导空格和多个空格。我希望用空格替换所有选项卡。多个空格与一个空格,并删除前导空格。
事实上,这会变成输入数据:
[ asdf asdf asdf asdf ]
进入输出数据:
[asdf asdf asdf asdf]
我该怎么做呢?
用单个空格修剪、替换制表符和多余的空格:
$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
$data = trim(preg_replace('/\s+/g', '', $data));
假设方括号不是字符串的一部分,并且您只是将它们用于说明目的,那么:
$new_string = trim(preg_replace('!\s+!', ' ', $old_string));
您可能可以使用单个正则表达式来做到这一点,但这将是一个相当复杂的正则表达式。上面的内容要简单得多。
注意:我还假设您不想用“AB CD”替换“AB\t\tCD”(\t 是一个制表符)。
$data = trim($data);
这摆脱了您的前导(和尾随)空格。
$pattern = '/\s+/';
$data = preg_replace($pattern, ' ', $data);
这会将一个或多个空间的任何集合变成一个空间。
$data = str_replace("\t", " ", $data);
这摆脱了你的标签。
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));
这个答案完全从字面上理解了这个问题:它只关心空格和制表符。诚然,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
修剪。
如果您也需要删除
。
$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));
经过很多挫折后,我发现这是最好的解决方案,因为它还删除了可能是两个字符长的非中断空格:
$data = html_entity_decode(str_replace(' ',' ',htmlentities($data)));
$data = trim(preg_replace('/\h/', ' ', $data));
// 替换比 \s 更多的空格字符类型
见比利诺亚
只需使用这个正则表达式
$str = trim(preg_replace('/\s\s+/', ' ', $str));
它会将所有制表符和空格替换为一个空格,
这里 sign +
in regex 表示一次或多次,pattern 表示,凡有两个或多个空格的地方,用一个空格替换