在PHP中如何修剪heredoc(长字符串)中的每一行

11

我希望您能创建一个可以剪切长字符串中每行的 PHP 函数。

例如,

<?php
$txt = <<< HD
    This is text.
          This is text.
  This is text.
HD;

echo trimHereDoc($txt);

输出:

This is text.
This is text.
This is text.

是的,我知道trim()函数,但我不确定如何在heredoc等长字符串上使用它。


感谢提供的所有解决方案。我需要学习更多的正则表达式。 - Yada
4个回答

29
function trimHereDoc($t)
{
    return implode("\n", array_map('trim', explode("\n", $t)));
}

1
+1 因为这是更通用的解决方案。(但是,我不喜欢如此紧凑的代码行) - erenon
1
请注意,这也会去除可能与换行符(\n)配对的回车符(\r)。源文件可能是使用DOS或Apple行结尾编写的,但结果被修剪的行将全部具有Unix行结尾。您可以在explode()语句的第一个参数中设置最终想要的行结尾。 - Jason
1
如果你想从字符串中删除换行符,只需在implode函数中省略"\n"参数:return implode(array_map('trim', explode("\n", $t))); - dval

11
function trimHereDoc($txt)
{
    return preg_replace('/^\s+|\s+$/m', '', $txt);
}

^\s+匹配行首的空格,而\s+$匹配行尾的空格。标志m表示进行多行替换,因此^$将匹配多行字符串中的任何行。


很好的正则表达式。需要保留这些代码片段。 - Yada
3
这个函数实际上是不正确的,因为它会以混乱的方式删除空行。正确的方法是使用模式"/^[ \t\f]+|[ \t\f]+$/m"。 - WASD42

6

简单的解决方案

<?php
$txtArray = explode("\n", $txt);
$txtArray = array_map('trim', $txtArray);
$txt = implode("\n", $txtArray);

6
function trimHereDoc($txt)
{
    return preg_replace('/^\h+|\h+$/m', '', $txt);
}

\s+用于去除空行,而\h+则保留每个空行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接