如何在PHP中用变量中的空格替换制表符?

如何在PHP中用变量中的空格替换制表符?,php,replace,tabs,spaces,Php,Replace,Tabs,Spaces,$data包含制表符、前导空格和多个空格。我希望用空格替换所有选项卡。使用一个空格填充多个空格,并删除前导空格 $pattern = '/\s+/'; $data = preg_replace($pattern, ' ', $data); 事实上,有一件事会改变输入数据: [ asdf asdf asdf asdf ] 输入输出数据: [asdf asdf asdf asdf] 我该怎么做 $data = trim(preg_replace('/\s

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

$pattern = '/\s+/';
$data = preg_replace($pattern, ' ', $data);
事实上,有一件事会改变输入数据:

[    asdf asdf     asdf           asdf   ] 
输入输出数据:

[asdf asdf asdf asdf]
我该怎么做

$data = trim(preg_replace('/\s+/g', '', $data));
这样就去掉了前导(和尾随)空格

这会将一个或多个空间的任何集合转换为一个空间

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

这样就不用使用制表符了。

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

$new_string = trim(preg_replace('!\s+!', ' ', $old_string));
你也许可以用一个正则表达式来实现,但这将是一个相当复杂的正则表达式。上述内容要简单得多


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

修剪,用单个空格替换制表符和额外空格:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
用这个正则表达式就行了

$str = trim(preg_replace('/\s\s+/', ' ', $str));
它将用一个空格替换所有选项卡和空格

这里,正则表达式中的符号
+
表示一次或多次,
模式意味着,只要有两个或两个以上的空格,就用一个空格替换它。这个答案完全是字面意思:它只涉及空格和制表符。当然,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
的值发生变化,使它们在未来成为需要的话,这与其说是因为在这种情况下需要它们,不如说是“防御性”编程

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

如果替换数组中的元素少于模式数组中的元素,则任何额外的模式都将替换为空字符串


因此,我们使用的不是模式字符串和替换字符串,而是模式数组和替换数组,这会导致额外的模式
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


请参见

您还忘了提及修剪以去除前导空格。可能也要提到ltrim,因为他要求前导空格,然后画了两端。是的,谢谢你指出这一点。在这个例子中,前导空格和尾随空格都应该被删除,所以我更新了我的代码。除非指定限制参数,“g”修饰符不起作用,否则默认替换图案的所有引用。根据php的说法,不需要在同一行重复整个文本,即使它包含换行符,也被php视为一行减去一的替换字符串,该替换字符串删除了所有空格,甚至是OP希望在“单词”之间保留的单个空格你是想不加考虑地剥离所有选项卡,还是想保留列式格式?我认为你应该重新评估答案并接受不同的答案。如果某个模式与单独选项卡不匹配(以及在发布前没有测试你的解决方案),则减一。如果您正在使用
\s
您不需要
\t
如果您正在使用
\s
您不需要
\t
首先,这是一个笨拙的模式。其次,当您编写它时,它不会重新扫描,因此它将为运行
选项卡
空间
选项卡
空间
选项卡
空间
选项卡
空间
选项卡
空间
。你测试过这个吗?这应该是公认的答案。我发布我的答案只是为了反驳你的说法,即用
preg\u replace
修剪是“复杂的”。美丽的答案。非常感谢。
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
function trim_press( $data ){
    return preg_replace( [ M, L, R ], [ T ], $data );
}
$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));