使用Regex从textarea发布结果中删除行

时间:2013-01-23 12:30:14

标签: php html regex

我正在尝试从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);

3 个答案:

答案 0 :(得分:1)

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

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

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

$text = preg_replace("/\bTo:.*?\n/", "", $var, 1);
  • \b标记单词的开头
  • .*? 非贪婪<{1}} ,意味着在符合?时匹配停止
  • 最后\n告诉1只替换一个(第一个)出现的事件 (我最初忘记了,默认是全部 - PHP 不是 Perl ..)

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

-

(实际上,更准确地说,y也可以使用,因为未使用/\bTo:.*\n/修饰符,s.*不匹配。 \n修饰符s.匹配,\n是必需的:?。但是更明确的是将它与/\bTo:.*?\n/s一起使用,最好不要忘记这个有用的选项!)

答案 1 :(得分:1)

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

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

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

Demo

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

答案 2 :(得分:0)

尝试使用explode

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

现在取消设置您想要的密钥