【发布时间】:2011-05-13 19:12:29
【问题描述】:
对于一个愚蠢的 bbcode 解析器,我想将两个定义合二为一,我原来的定义是 preg_replace:
'#\[s\](.*?)\[/s\]#si', '<strike>\\1</strike>'
这行得通,我希望用户能够使用[s] 或[strike] 来启动该格式的文本,所以我自然地添加了类似这样的内容,认为它会起作用:
'#\[(s|strike)\](.*?)\[/(s|strike)\]#si', '<strike>\\1</strike>'
不幸的是,[s] 和 [strike](正确使用)都失败了,而不是你所期望的: 和 s(我的降价是正确显示其真实外观的结果,无论里面是什么,它都会显示 s 或罢工)strike
为什么它用标签名称代替内部文本?我在 s|strike 周围添加括号有问题吗?我可能做错了..
【问题讨论】:
-
BBcode 不规则。使用BBCode parser
-
@Gordon:你找错树了。现代正则表达式几乎与常规语言和兼容性类无关。自从 Ken Thompson 在
grep中首次将(.)\1放入他的回溯 NFA 代码中之后,正则表达式就不再是常规的了:(.)\1描述的语言在 st00pid 教科书 REGULARity 定义中是 not REGULAR使用哪些不适用于现代正则表达式。 -
@Gordon:你不是说不可行;你的意思是不实用,或者可能不方便。我当然不建议重新发明完美的轮子。我只是厌倦了人们漫不经心地重复这种轻描淡写的副歌,“你不能用正则表达式做 X”,当他们 真的 意味着一个或多个 “我们不知道该怎么做”、“不要这样做”或“有更简单的方法可以实现您的目标。”这是轻蔑和不诚实的,甚至是不诚实的。但是询问者应该明白,将所有内容都放入一个正则表达式中并没有道德上的优势。事实上,它有很多缺点。
-
@Gordon:相反,我强烈地和大声地不同意你。高级术语 REGULAR 的误用与真正的模式匹配无关。它具有高度不规则且完全违反直觉的含义,除了象牙塔的蛋头外,它会欺骗任何人。我厌倦了听到你和其他人假装正则表达式是常规的。它们不是,甚至要求它们不是:请注意,即使是 POSIX BRE 也必须支持反向引用,从而使您的所有常规自夸都是谎言。
\((?:[^()]*+|(?0))*\)是一个漂亮的正则表达式。