【问题标题】:Remove spaces at the start of each line in a multiline string variable删除多行字符串变量中每行开头的空格
【发布时间】:2016-09-09 06:40:47
【问题描述】:

我尝试从段落中删除空格,但失败了。

我有这样的输入:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Sed et nisl 无。 Aenean interdum eget augue vehicula commodo。 Etiam 调味品。

--Nunc lacinia dui eget volutpat porta。 Morbi eu magna ornare, facilisis risus eget, varius sem. Proin hendrerit lacus condimentum。

--Duis eget vehicula orci。 Curabitur laoreet velit sat amet ligula congue, eget consectetur risus ultricies。 Curabitur dictum felis at。

我有提到“--”的空格,我需要从那里删除空格。

我试过这些:

str_replace(' ', '', $string)
preg_replace('/\s+/',
preg_replace('!(\<br ?/?\>)([ ]|\t)+!i', '<br />', $str);
string.replaceAll("<br />\\p{Space}+", "<br />");

如果我将\t 更改为\s,则没有任何效果。它会删除空格,但也会删除单词之间的空格。

【问题讨论】:

  • -- 后面是去掉空格还是加空格?
  • 这是否意味着您有&lt;br/&gt; 作为换行符?试试preg_replace('~((?:&lt;br\s*/?&gt;\R?){2})\h+~', '$1', $str)
  • @PankajPawar 你试过我的替代方案了吗?
  • 这三个段落在一个变量(一个字符串)中。
  • 我提到“--”的地方有空间,我想删除它。三个段落在一个变量中(一个字符串)。

标签: php html regex


【解决方案1】:

当前发布的答案都没有表现出任何优雅或直接。

我的正则表达式包含 3 个字符和一个模式修饰符。 /^ +/m

  • 结尾处的m 表示在模式中找到的任何^ 都将代表每个换行符的开头(而不是像通常那样的字符串的开头)。
  • 我使用的是文字空白字符,但一些开发人员更喜欢使用 \s 以提高可读性并涵盖可能遇到的一系列空白字符。
  • + 表示前面的一个或多个字符/表达式。我本可以使用有限量词/^ {2}/m,但在这种情况下选择了模式简洁性和灵活性。

代码:(Demo)

$text = <<<TEXT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed et nisl nulla. Aenean interdum eget augue vehicula commodo. Etiam condimentum.

  Nunc lacinia dui eget volutpat porta. Morbi eu magna ornare, facilisis risus eget, varius sem. Proin hendrerit lacus condimentum.

  Duis eget vehicula orci. Curabitur laoreet velit sit amet ligula congue, eget consectetur risus ultricies. Curabitur dictum felis at.
TEXT;

echo preg_replace('/^ +/m', '', $text);

输出:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed et nisl nulla. Aenean interdum eget augue vehicula commodo. Etiam condimentum.

Nunc lacinia dui eget volutpat porta. Morbi eu magna ornare, facilisis risus eget, varius sem. Proin hendrerit lacus condimentum.

Duis eget vehicula orci. Curabitur laoreet velit sit amet ligula congue, eget consectetur risus ultricies. Curabitur dictum felis at.

【讨论】:

  • 非常简单。感谢您分解其背后的逻辑!
  • @Pankaj 我想我同意其他人的观点。您知道发布优秀答案时可以移动勾号吗?
  • @Inc 最好对您的字符串进行 var_dump 并尝试找出它是 实际上 单字节文字空间还是其他一些空白字符。可能是 unicode/多字节字符?你必须让我知道。
  • /^ */m 会做不必要的工作——它还会用空字符串替换空字符串。
  • 你是对的......由于某种原因,当我最初使用你所拥有的东西时,每一行都有一个前置空格。然而现在,在回到最终的清洁代码并输入/^\s*/m(也可以清除标签)之后,一切都正常了。所以,忽略我最初的评论(删除它)。对不起。是的,这是最优雅/最好的解决方案!
【解决方案2】:
$str = "REPlACE THIS WITH YOUR TEXT STRING";
// split the string by the newline character, no limit, without empty
$_arr = preg_split("/[\r\n]+/",$str,-1,PREG_SPLIT_NO_EMPTY);

$arr=[];
foreach($_arr as $line){
    // trim these line
    array_push($arr,trim($line));
}

var_dump($arr);

我已经测试过,工作正常。

【讨论】:

    【解决方案3】:
    join("\n", array_map('trim', preg_split('/\R/', $string)));
    

    【讨论】:

      【解决方案4】:
      //separates the paragraph into 3 strings, divided by '--'
        list($string1, $string2, $string3) = explode('--',$string);
      
      //trim() takes out the spaces before and after each string
        $string1 = trim($string1);
        $string2 = trim($string2);
        $string3 = trim($string3);
      
        echo $string1." ".$string2." ".$string3;
      

      如果这对你有用,请告诉我。

      【讨论】:

      • 原文中没有--我有空格我提到“--”我需要从那里删除这些空格。
      • 这三个段落在一个变量(一个字符串)中。
      • @PankajPawar 好吧.. 将 explode('--',$string) 替换为 explode(PHP_EOL,$string),如果这不起作用,请尝试:explode('\n',$string)。其中一项有效吗?
      【解决方案5】:

      你可以像这样使用 from trim:

      ltrim($string, ' ');
      

      此代码将删除 $string 中的第一个空格,还有 rtrim、trim 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        相关资源
        最近更新 更多