删除php字符串中以某个字符开头的新行

时间:2017-11-20 21:02:44

标签: php regex

我想删除以>

开头的php字符串中的行

我尝试将其爆炸成数组,但似乎无法正常工作

$email = "This is the only text I want

> On Nov 19, 2017, at 10:58 PM, > wrote:
> 
> this is trash
>
";
$array = explode("\n",$email);
foreach($array as $arr) {
   if(!(preg_match(">",$arr))) {
    $output[] = $arr;
   }
}

$out = implode("\n",$output);
echo $out;

3 个答案:

答案 0 :(得分:1)

可以使用

删除换行符
PHP

<小时/> 在<?php $string = <<<DATA This is the only text I want > On Nov 19, 2017, at 10:58 PM, > wrote: > > this is trash > DATA; $regex = '~^(>.*)\R?~m'; $string = preg_replace($regex, "$1", $string); echo $string; ?>

This is the only text I want

> On Nov 19, 2017, at 10:58 PM, > wrote:> > this is trash>

<小时/> 这产生了

TreeBagger

<小时/> 请参阅a demo on regex101.com

答案 1 :(得分:0)

<?php

$email = "This is the only text I want

> On Nov 19, 2017, at 10:58 PM, > wrote:
> 
> this is trash
>
";

$lines    = preg_split('/\R/', $email);
$filtered = [];
foreach($lines as $line)
    if(!preg_match('/^>/', $line))
        $filtered[] = $line;

$filtered = implode("\r\n", $filtered);
var_dump($filtered);

输出:

string(32) "This is the only text I want

"

答案 2 :(得分:0)

如果我理解您的任务背后的逻辑,您希望删除电子邮件文本中的所有“事先通信”,该字母用>开头的行表示。

现在,请记住,我已经看过电子邮件,人们在新文本中交错旧对话文本,以逐项的方式作出回应。任何在此类情况下删除先前集合的尝试都将损害消息的意图。如果在项目范围内不会发生这种情况,那么我们可以使用干净的方法继续前进:

代码:(Demo

$email = 'This is the only text I want

> On Nov 19, 2017, at 10:58 PM, > wrote:
> 
> this is trash
>
';

var_export(preg_replace('/\s*\R>.*/s','',$email,-1,$count));
echo "\n\nNumber of Replacements: $count";

输出:

'This is the only text I want'

Number of Replacements: 1

此方法不仅会删除单个匹配/替换中的所有先前对话文本,而且还会更进一步,并从当前会话文本的末尾修剪尾随空格。这是通过在\s*之前匹配零个或多个空格字符(\R)并允许点(.)匹配由于s标记/而引起的换行符来实现的模式结束时的修饰符。

您会注意到,如果从模式中删除s标志,则替换次数变为4且最终换行符不匹配(因为它后面没有> 1}}。

如果这是我的项目,这正是我做的方式,因为你得到了一个非常干净的结果和最少的操作去那里。

P.S。对于您的实施,只需使用:preg_replace('/\s*\R>.*/s','',$email);