对于一个愚蠢的 bbcode 解析器,我想将两个定义添加到一个中,我最初的 preg_replace 定义是这样的:
'#\[s\](.*?)\[/s\]#si', '<strike>\\1</strike>'
这可行,我希望用户能够使用 [s]
或 [strike]
来启动该格式的文本,所以我自然地添加了像这样的想法会起作用:
'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>'
不幸的是,失败了,[s]
和 [strike]
(正确使用)都生成: 和 s
(我的 markdown 正确地显示了其真实的结果,无论里面有什么,它都会显示 s 或 Strike)strike
为什么它用标签名称替换内部文本?我在 s|strike 周围添加括号有问题吗?我可能做错了..
最佳答案
问题是您添加了两个新的正则表达式组,开始标记中的 (s|strike)
和结束标记中的 (s|strike)
。因此,在生成的代码中,您将得到 s
或 strike
。您只需使用正确的组号 2
即可解决该问题。
另一种方法是通过在开头添加 ?:
来使新组成为非引用,但我想第一个解决方案更容易理解:
#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si
关于PHP/正则表达式 : simple regex for bbcode [s] or [strike] fails to work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4245008/