2

对于一个愚蠢的 bbcode 解析器,我想将两个定义合二为一,我的原始定义是 preg_replace:

'#\[s\](.*?)\[/s\]#si', '<strike>\\1</strike>'

这行得通,我希望用户能够使用[s][strike]以该格式启动文本,所以我自然地添加了类似这样的东西,认为它会起作用:

'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>'

不幸的是,这失败了,而不是你所期望的,[s]and [strike](正确使用) make: sand strike(我的降价是正确的,以显示它的真实外观结果,它显示 s 或罢工,不管里面有什么)

为什么它用标签名称代替内部文本?我在 s|strike 周围添加括号有问题吗?我可能做错了这一切..

4

1 回答 1

3

问题是您(s|strike)在开始标记和(s|strike)结束标记中添加了两个新的正则表达式组。因此,在生成的代码中,您将获得sor strike。您可以通过简单地使用正确的组号来解决此问题,2.

另一种方法是通过在开头添加 a 来使新组不引用,?:但我想第一个解决方案更容易理解:

#\[(?:s|strike)\](.*?)\[/(?:s|strike)\]#si
于 2010-11-22T11:42:10.880 回答