仅在单独行中删除术语


16

我有这个:

$text = '
   hello world
    
    hello
';

我如何  在其自己的线路上将其删除?因此,在上面的示例中,第二个 应删除。结果应为:

$text = '
   hello world

    hello
';

到目前为止我尝试过的

通过str_replace(),我可以:

$text = str_replace(' ', '', $text);

但这不仅会删除的所有实例 ,而且会单独删除。


6
我到目前为止所尝试的内容的精美添加-在该网站上应该是标准的。+1
加里·伍兹

2
@misorude请随时用您的方法发表答案。
Henrik Petterson

1
@OfirBaruch我尝试了$text = str_replace('\n'.' '.'\n', '', $text);但没用。请参阅
Henrik Petterson

3
@FlashThunder为什么不发布答案str_replace()而不是判断我的经验。=)
亨里克·佩特森

2
@misorude但是,如果您认为这是一个站点范围的问题,那么您需要在meta上与社区进行讨论。你为什么要把它推到这里?
Henrik Petterson

Answers:


10

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

// 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

这也将删除空格,并且作者只想删除 
Flash Thunder

@FlashThunder我已将输出的内容与输出完全对齐,此问题已被要求。如果您检查我的输出是否与初始要求相同:)您是否尝试在PHP 7中运行我的代码?您还有其他输出吗?
Merianos Nikos

我要说的是,作者甚至不知道其中有一个制表符/少量空格,因为他在其他评论中要求它后面有空格(并且不包含空格)。
Flash Thunder

我知道@FlashThunder。我只是问一个案例。
Henrik Petterson

1
哦,对不起,必须是一次误点击
Flash Thunder

2

我的方法是:

  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);

2
您的代码输出与要求的输出并不相同 :另外,请记住,不是我否定了您的答案:)我的评论只是一条友好的消息:)
Merianos Nikos

1
好的,我更新了我的答案以纠正此问题
JanP

1
现在好多了:)
Merianos Nikos

2

也许是这样的:

$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);
?>

1
我测试了它,但不起作用:)。另外请记住,我没有给你任何反对票。这只是一个友好的评论:)测试您的解决方案后,输出保持不变。
Merianos Nikos

@MerianosNikos怎么了??sandbox.onlinephpfunctions.com/code/...
闪光雷

1
这就是我得到了我的地方,当我运行代码:pasteboard.co/IUkf2MK.png :)
Merianos尼科斯

2
@MerianosNikos哦,很有趣,它可以在PHP5上使用,但不能在PHP7上使用。
Flash Thunder

也许你是对的。我在PHP 7.运行
Merianos尼科斯

1

如果您知道自己的行尾字符,并且您&nbsp;总是后面跟着一个新行:

<?php
$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';


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

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

   hello&nbsp;world

   &nbsp;hello

注意:任何以a结尾的行都&nbsp;将受到影响,因此这可能无法满足您的需求。


1
如果我们坚持下去,这实际上是一个非常可靠的解决方案str_replace()
Henrik Petterson

是吗?我可以看到更多的情况下,当它不会工作
闪存雷霆

@Progrock是否有可能以某种方式调整它,之后它需要计算空格&nbsp;?例如:"&nbsp; \n"
Henrik Petterson

@HenrikPetterson no
Flash Thunder

1

您可以为此使用正则表达式,将DOTALL和MULTILINE修饰符与环顾断言一起使用:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm):点(s)多线(米)
  • (?<=\n):在换行符之前(不属于比赛)
  • \s*&nbsp;\s*:单身&nbsp; 带有可选的空白
  • (?=\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
   """
>>>

0

您可以拆分为几行,然后替换&nbsp;仅包含&nbsp;和的行上的空字符串。

通过捕获它们,我们将保留原始的行尾。

<?php

$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
    if (trim($v) === '&nbsp;')
        $v = str_replace('&nbsp;', '', $v);

$result = implode($lines);
var_dump($result);

输出:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.