实现简单正则表达式的建议(用于 bbcode/geshi 解析)
我用 PHP 制作了一个个人笔记软件,这样我就可以存储和组织我的笔记,并希望有一个简单的格式来编写它们。
我在 Markdown 中完成了它,但发现它有点令人困惑,并且没有简单的语法突出显示,所以我之前做过bbcode并希望实现它。
现在,对于我真正希望实现的 GeSHi(语法荧光笔),它需要最简单的代码,如下所示:
$geshi = new GeSHi($sourcecode, $language);
$geshi->parse_code();
现在这是简单的部分,但我想做的是允许我的 bbcode 调用它。
我当前匹配编写的 [syntax=cpp][/syntax] bbcode 的正则表达式如下:
preg_replace('#\[syntax=(.*?)\](.*?)\[/syntax\]#si' , 'geshi(\\2,\\1)????', text);
您会注意到我捕获了语言和内容,我到底如何将其连接到 GeSHi 代码?
preg_replace 似乎只能用字符串而不是“表达式”替换它,我不确定如何使用 GeSHi 的这两行代码与捕获的数据一起使用。
我对这个项目感到非常兴奋,并希望克服这个。
I had made a personal note software in PHP so I can store and organize my notes and wished for a nice simple format to write them in.
I had done it in Markdown but found it was a little confusing and there was no simple syntax highlighting, so I did bbcode before and wished to implement that.
Now for GeSHi which I really wish to implement (the syntax highlighter), it requires the most simple code like this:
$geshi = new GeSHi($sourcecode, $language);
$geshi->parse_code();
Now this is the easy part , but what I wish to do is allow my bbcode to call it.
My current regular expression to match a made up [syntax=cpp][/syntax] bbcode is the following:
preg_replace('#\[syntax=(.*?)\](.*?)\[/syntax\]#si' , 'geshi(\\2,\\1)????', text);
You will notice I capture the language and the content, how on earth would I connect it to the GeSHi code?
preg_replace seems to just be able to replace it with a string not an 'expression', I am not sure how to use those two lines of code for GeSHi up there with the captured data..
I really am excited about this project and wish to overcome this.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不久前编写了这个类,该类的原因是为了允许轻松定制/解析。也许有点矫枉过正,但效果很好,我需要它对我的应用程序矫枉过正。用法非常简单:
---- OR ----
我必须从我拥有的其他自定义项目中进行一些剪切,但等待剪切中没有语法错误,它应该可以工作。请随意使用它。
I wrote this class a while back, the reason for the class was to allow easy customization / parsing. Maybe a little overkill, but works well and I needed it overkill for my application. The usage is pretty simple:
---- OR ----
I had to do some chopping from other custom items I had, but pending no syntax errors from the chopping it should work. Feel free to use it.
在我看来,你的正则表达式已经正确了。您的问题在于调用,因此我建议制作一个包装函数:
现在这通常就足够了,但源代码本身可能包含单引号或双引号。因此,您不能根据需要编写
preg_replace(".../e", "geshi('$2','$1')", ...)
。 (请注意,'$1' 和 '$2' 需要引号,因为 preg_replace 只是替换 $1,$2 占位符,但这需要是有效的 php 内联代码)。这就是为什么您需要使用
preg_replace_callback
来避免 /e exec 替换代码中的转义问题。例如:
我会制作第二个包装器,但您可以将其与原始代码结合起来:
It looks to me like you already got the regex right. Your problem lies in the invocation, so I suggest making a wrapper function:
Now this would normally suffice, but the source code is likely to contain single or dobule quotes itself. Therefore you cannot write
preg_replace(".../e", "geshi('$2','$1')", ...)
as you would need. (Note that '$1' and '$2' need quotes because preg_replace just substitutes the $1,$2 placeholders, but this needs to be valid php inline code).That's why you need to use
preg_replace_callback
to avoid escaping issues in the /e exec replacement code.So for example:
And I'd make a second wrapper, but you can combine it with the original code:
使用 preg_match:
Use preg_match: