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

Posted

技术标签:

【中文标题】如何在 PHP 中的变量中用空格替换制表符?【英文标题】:How do I replace tabs with spaces within variables in PHP? 【发布时间】:2010-11-13 23:19:19 【问题描述】:

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

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

[    asdf asdf     asdf           asdf   ] 

输入输出数据:

[asdf asdf asdf asdf]

我该怎么做?

【问题讨论】:

您是否尝试剥离 所有 选项卡,或者您是否希望列式维护格式? 我认为您应该重新评估答案并接受不同的答案。 【参考方案1】:
$data = trim(preg_replace('/\s+/g', '', $data));

【讨论】:

您还忘了提及 trim 以消除前导空格。可能还想提到 ltrim,因为他要求前导空格然后说明两端。 是的,感谢您指出这一点。在示例中,显示应该删除前导空格和尾随空格,因此我更新了代码。 有帮助。 preg_replace 默认替换所有出现的模式,除非你指定了limit参数。 “g”修饰符不起作用。根据php.net/manual/en/reference.pcre.pattern.modifiers.php 不需要“g”在同一行重复整个文本,即使它包含换行符,php 也将其视为一行 减去一个用于删除所有空格的替换字符串,甚至是 OP 在他的“单词”之间想要的单个空格【参考方案2】:
$data = trim($data);

这消除了您的前导(和尾随)空格。

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

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

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

这样可以摆脱你的标签。

【讨论】:

如果您使用的是\s,则不需要\t【参考方案3】:

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

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

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

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

【讨论】:

这应该是公认的答案。我发布我的答案只是为了反驳您声称使用 preg_replace 进行修剪是“复杂的”。 美女回答。谢谢。【参考方案4】:
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));

【讨论】:

如果您使用的是\s,则不需要\t【参考方案5】:

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

$data = preg_replace('/[ ]2,|[\t]/', ' ', trim($data));

【讨论】:

首先,这是一个笨重的模式。其次,正如您编写的那样,它不会重新扫描,因此它将为tabspacetabspacetabspace 的运行产生多个空格。你测试了吗?【参考方案6】:

只需使用这个正则表达式

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

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

这里在正则表达式中签名+ 表示一次或多次, 模式的意思是,只要有两个或多个空格,就用一个空格替换它

【讨论】:

对于无法匹配单独选项卡的模式(以及在发布之前未测试您的解决方案)的模式减一。【参考方案7】:

这个答案完全从字面上理解了这个问题:它与空格和制表符有关。当然,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 escape characters 来指定主题的开始和结束,而不是典型的^$,它们是面向行的meta-characters。这与其说是因为在这种情况下需要它们,不如说是“防御性”编程,如果S 的值发生变化以使它们在未来被需要的话。

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

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

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

因此,我们使用的是模式数组和替换数组,而不是模式字符串和替换字符串,这会导致多余的模式 LR 被修剪。

【讨论】:

【参考方案8】:

如果您还需要删除  

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));

【讨论】:

【参考方案9】:

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

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

见billynoah

【讨论】:

以上是关于如何在 PHP 中的变量中用空格替换制表符?的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 的文本文件中用逗号替换空格

如何在 PHP 中用单个空格正确替换多个空格?

如何在PHP中用正则表达式替换所有实际上不是空格的空格

Java如何去除字串中的空格、回车、换行符、制表符

如何替换掉字符串里的空格?

如何替换掉字符串里的空格?