我试图用标签包装以“##”开头的每一行。尝试实现类似 GitHub/Stackoverflow 的文本格式化语法。
这就是我得到的:
$value = preg_replace('/^## (.*)$/m', '<p>$1</p>', $value);
经过谷歌搜索很长一段时间后,这似乎是正确的解决方案,但它没有按预期工作,或者我只是不明白一些东西。
示例文本:
## Some header 1
Some text that doesn't need to be altered
## Some header 2
这是结果:
<p>Some header 1
</p>
Some text that doesn't need to be altered
<p>Some header 2</p>
正如您所看到的,第二个标头得到了很好的处理,因为它位于文本的末尾。然而,第一个标头在结束标记之前的末尾会获得一个额外的新行。我该如何摆脱它?
似乎在您当前的 PCRE 设置中,一个点匹配除 LF 之外的所有字符(\n
,换行),因此,它匹配 CR (\r
,回车),这也是一个换行符。
PCRE 支持覆盖默认换行符(因此$
锚)。为了使.
匹配除CR和LF之外的所有字符,打开相应的标志:
'/(*ANYCRLF)^## (.*)$/m'
^^^^^^^^^^
$
将在之前断言行尾\r\n
.
有关此动词和其他动词的更多信息,请参见reexegg.com:
默认情况下,编译 PCRE 时,您可以告诉它在遇到.
(作为点,它不匹配换行符,除非在点模式),还有^
and $
锚点的行为多行模式。您可以使用以下修饰符覆盖此默认值:
✽ (*CR)
只有回车符才被认为是换行符
✽ (*LF)
只有换行符才被视为换行符(如在 Unix 上)
✽ (*CRLF)
只有回车符后跟换行符才被视为换行符(如在 Windows 上)
✽ (*ANYCRLF)
以上三者中任何一个都被认为是换行符
✽ (*ANY)
任何 Unicode 换行序列都被视为换行符
例如,(*CR)\w+.\w+
火柴Line1\nLine2
因为点能够匹配\n
,这不被视为换行符。看demo.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)