我想删除以>
我尝试将其爆炸成数组,但似乎无法正常工作
$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;
答案 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);