我正在尝试从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);
答案 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
修饰符,因为这会导致.
也匹配换行符,而这不是你想要的。
顺便说一下,根据规范,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);
现在取消设置您想要的密钥