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
跟踪,以便将其与替换一起删除?
答案 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);
.*?
让它变得非贪婪。