我可以使用preg_replace在多行模式下去除尾部\ n吗?

时间:2011-03-21 13:22:49

标签: php regex

I just answered a question here,这让我问自己的问题。

基本上,如果包含字符串,则OP希望删除任何行。这是我提出的正则表达式...

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*$/m', '', $str);

效果很好,但因为$在尾随\n之前匹配,所以在替换时它们会保留,并且有空行,例如。

string(90) "
What it shouldhello do is:


could be words in between brackets and inverted commas also."

我无法使用\z,因为我处于多线模式(至少这是我的想法)。

如果我使用s修饰符,则.会变得过于贪婪,并且无法跨换行。

我尝试了一些事情(例如[^\n][\s\S]),现在我感到很难过。

如何匹配此处的\n跟踪,以便将其与替换一起删除?

3 个答案:

答案 0 :(得分:2)

使用\ n而不是$。

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n/m', '', $str);

如果它中有问候,这就错过了最后一行,所以这里更进了一步。

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*(\n|$)/m', '', $str);

现在的问题是删除了最后一行,但仍然有\ n字符(你已经有类似的问题)。

注意:我根本不是正则表达专家,通常可以满足我的需求。

答案 1 :(得分:1)

我觉得自己很难搞清楚这一点,但我用Jacob's answer作为依据......

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n?/m', '', $str);

看起来我只是过于敏锐才能使用行尾锚。

这个允许最后选择\n。它还会在最后一个非匹配行的末尾留下\n,但我可以随时trim($str)

答案 2 :(得分:0)

请试试这个:

$str = preg_replace('/^.*?\b["(]?hello["(]?\b.*?$/s', '', $str);

.*?让它变得非贪婪。