我可以使用 preg_replace 在多行模式下去除尾随 \n 吗?
Posted
技术标签:
【中文标题】我可以使用 preg_replace 在多行模式下去除尾随 \\n 吗?【英文标题】:Can I use preg_replace to strip the trailing \n in multiline mode?我可以使用 preg_replace 在多行模式下去除尾随 \n 吗? 【发布时间】:2011-03-21 13:22:49 【问题描述】: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
以便通过替换将其删除?
【问题讨论】:
【参考方案1】:使用 \n 代替 $。
$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n/m', '', $str);
如果里面有 hello,这会错过最后一行,所以这里更进一步。
$str = preg_replace('/^.*\b["(]?hello["(]?\b.*(\n|$)/m', '', $str);
现在的问题是最后一行被删除了,但仍然有一个 \n 字符(您已经遇到了类似的问题)。
注意:我根本不是正则表达式专家,通常可以满足我的需要。
【讨论】:
除非这会错过最后一行,如果它有你好:S【参考方案2】:没有搞清楚这个我觉得很傻,但我用Jacob's answer作为基础......
$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n?/m', '', $str);
看来我只是太热心无法使用行尾锚点。
这个允许在最后使用可选的\n
。它还在最后一个不匹配行的末尾留下一个\n
,但我总是可以然后trim($str)
。
【讨论】:
和我有同样的问题,因为我的编辑......最后一行:S【参考方案3】:请试试这个:
$str = preg_replace('/^.*?\b["(]?hello["(]?\b.*?$/s', '', $str);
.*?
使它不贪婪。
【讨论】:
抱歉,这不起作用,它只是用空字符串替换了整个字符串。以上是关于我可以使用 preg_replace 在多行模式下去除尾随 \n 吗?的主要内容,如果未能解决你的问题,请参考以下文章