为了账号安全,请及时绑定邮箱和手机立即绑定

仅当术语位于其自己的行上时才将其删除

仅当术语位于其自己的行上时才将其删除

PHP
千万里不及你 2022-09-17 17:49:49
我有这个:$text = '   hello world        hello';如何删除它,只有当它在自己的线上?因此,在上面的例子中,第二个应该被删除。结果应为:  $text = '   hello world    hello';到目前为止,我尝试过什么通过,我可以:str_replace()$text = str_replace(' ', '', $text);但是,这将删除 的所有实例,而不仅仅是当它位于自己的行上时。 
查看完整描述

5 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

我已经尝试过这种方法,我得到了你想要的输出


// Your initial text

$text = '

   hello world

    

    hello

';


// Explode the text on each new line and get an array with all lines of the text

$lines = explode("\n", $text);


// Iterrate over all the available lines

foreach($lines as $idx => $line) {

    // Here you are free to do any if statement you want, that helps to filter

    // your text.


    // Make sure that the text doesn't have any spaces before or after and 

    // check if the text in the given line is exactly the same is the  

    if ( ' ' === trim($line) ) {

        // If the text in the given line is   then replace this line 

        // with and emty character

        $lines[$idx] = str_replace(' ', '', $lines[$idx]);

    }

}


// Finally implode all the lines in a new text seperated by new lines.

echo implode("\n", $lines);

我在本地的输出是这样的:



hello world


 hello


查看完整回答
反对 回复 2022-09-17
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我的方法是:

  1. 在新行上分解文本

  2. 修剪数组中的每个值

  3. 清空每个具有值的数组项 

  4. 用新线内爆

生成以下代码:

$chunks = explode(PHP_EOL, $text);

$chunks = array_map('trim', $chunks);

foreach (array_keys($chunks, ' ') as $key) {

    $chunks[$key] = '';

}

$text = implode(PHP_EOL, $chunks);


查看完整回答
反对 回复 2022-09-17
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

也许是这样的:


$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);

http://sandbox.onlinephpfunctions.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06


(这适用于 PHP5,但在某些版本的 PHP7 上却不起作用)


替代方案是:


<?php

    $lines = explode("\n",$text);

    foreach($lines as $n => $l)

        if(trim($l) == '&nbsp;')

            $lines[$n] = str_replace('&nbsp;','',$l);

    $text = implode("\n",$lines);

?>


查看完整回答
反对 回复 2022-09-17
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如果您知道行尾字符,并且您的行后始终跟着一个新行:&nbsp;


<?php

$text = '

   hello&nbsp;world

   &nbsp;

   &nbsp;hello

';



print str_replace("&nbsp;\n", "\n", $text);

输出(此处的格式设置中丢失了一些初始空格):


   hello&nbsp;world


   &nbsp;hello

警告:任何以其他内容结尾的行也会受到影响,因此这可能不能满足您的需求。&nbsp;


查看完整回答
反对 回复 2022-09-17
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

为此,您可以使用正则表达式,将 DOTALL 和多行修饰符与环视断言结合使用:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): 多点 (s) 多线 (m)

  • (?<=\n):换行符之前(不是匹配项的一部分)

  • \s*&nbsp;\s*: 单次具有可选的周围空格

  • (?=\n):尾随换行符(不是匹配项的一部分)

>>> $text = '                                                                                               

 hello&nbsp;world                                                                                         

 &nbsp;                                                                                                   

 &nbsp;hello                                                                                           

 ';

=> """

   \n

      hello&nbsp;world\n

      &nbsp;\n

      &nbsp;hello\n

   """

>>> preg_replace("~(?sm)(?<=\n)\s*&nbsp;\s*(?=\n)~", '',$text);

=> """

   \n

      hello&nbsp;world\n

   \n

      &nbsp;hello\n

   """

>>>


查看完整回答
反对 回复 2022-09-17
  • 5 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信