2

我正在尝试从 textarea 发布结果中删除一行,以“To”开头我的尝试:

$var = 'Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nTo: __To\nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job';

$text = preg_replace("/To(.*)$\n/s","",$var);

但它没有用。

我想要这个输出

Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job'

编辑:我使用的最后一个解决方案,考虑到输入来自 textarea

        $text = preg_replace("/To.*?Subject:/s","Subject:",$var);
4

3 回答 3

1

第一个解决方案,不使用\n和任何修饰符,首先是问题描述:

$text = preg_replace("/To.*?Subject:/","Subject:",$var);

这是一个更通用的版本,它使用结尾\n作为分隔符。

$text = preg_replace("/\bTo:.*?\n/", "", $var, 1);
  • \b标记单词的开头
  • .*??有为不贪心\n,意思是遇到匹配就停止
  • 最后1告诉preg_replace只替换一个(第一个)出现
    (我最初忘记了,默认是全部 - PHP不是Perl ..)

注意:在 php$var = ' x\n y\n';中不会扩展\nas CR,因为使用了单引号'。必须使用双引号:$var = " x\n y\n";获取xy在不同的行上。

--

(实际上,更准确地说,/\bTo:.*\n/也可以,因为s不使用修饰符与 ..*不匹配\n。使s修饰符.匹配 the\n和 the?是必要的:/\bTo:.*?\n/s。但无论如何使用它更清楚?,更好不要忘记这个有用的选项!)

于 2013-01-23T12:37:00.243 回答
1

您需要/m修饰符以^匹配每行的开头,然后使用此表达式:

$text = preg_replace("/^To:.*/m", "", $var);

我没有使用/s修饰符,因为这也会导致.匹配换行符,这不是你想要的。

演示

顺便说一句,根据规范,MIME 标头可能跨越多行;我在这个答案中忽略了这一点:)

于 2013-01-23T12:44:59.517 回答
0

尝试使用爆炸

$var = 'Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nTo: __To\nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job';
$arr = explode('\n', $var);

现在取消设置你想要的键

于 2013-01-23T12:38:52.840 回答