解析coolcode到SyntaxHighlighter和Mysql正则表达式的实现
最近,我花时间换到了SyntaxHighlighter。由于coolcode插件的开始标记是coolcode或[coolcode],而SyntaxHighlighter是[code lang='php'](或其他)。我们只能想办法把旧格式转换成新格式。当然,必须使用正则表达式。原始代码亮点标记为cool codelang=' PHP ' download=' 123 . PHP ' line num=' on ' cool codelang=' PHP ' line num=' off ' cool codelang=' PHP '。而SyntaxHighlighter的logo是[code lang='php'],按照需求编写的正则表达式是coolcode lang='[a-z]'。*?如下解释复制代码: [a-z]匹配php、javascript、cpp、sql、css等。以及以下内容。*?英寸表示除换行符以外的任何字符,而*表示0次或无数次。*这些表示时间的符号后面是?识别非贪婪模式
看图片。这种正则化可以满足上述要求。但是问题还没有解决,我们也没有考虑到另外一种情况,就是属性lang='php '不一定跟coolcode,但是可能是download或者linenum='on/off ',所以我们的规律性需要改变。CFC4N将常规代码更改为coolcode。*?lang='[a-z]'。*?截图如下
细心的朋友可能会看到图中匹配的红框中有更多的coolcodes,这意味着需要排除之前的coolcodes。如何排除?如果你聪明,你会立刻想到它。这个通用字符被一个不是两个符号的规则代替。好的,CFC4N马上修改。修改后的正则性是coolcode。*?lang='[a-z]'。*?果然,匹配正常。结果见截图。
至此,问题似乎已经解决。然而,当我感到困惑时,我同时使用了coolcode的初始标记,即coolcode和[coolcode]。那么,你认为读者应该重写这条规则吗?没错,无非就是标志的开头和结尾,考虑到两种情况和[,所以很容易改变规律性。(别忘了排除规则中的符号)[\ [] coolcode [\ [\]] *?'[^\[\]]*?[\]]好吧,好吧,我们来看看效果:。
很好,完美。现在,你可以去执行它。然而,我遇到了一件非常意想不到的事情。其实发现旧代码包含这样一种格式[cooldode line num=\ ' off ' lang=\ ' CPP \ ']cooldode download=\ ' \ ' lang=\ ' CPP ' line num=' off '。呃,问题来了,就多一个转义字符\,所以改一下。也就是说,\允许出现0次或一次,标识0次或一次的符号是?那么我们直接在\?也就是改成了这个\?够了吗?显然不是。在正则表达式中,\ "也意味着转义,所以如果匹配\,也必须转义\,应该是\ \?没错。修改后的规则是[\ [] coolcode [\ [\]] *?lang=\\?[a-z] \\?'[^\[\]]*?[\]]匹配结果如下图: 所示。
现在,你完成了。我们可以进行转换。转型有两种方式。Mysql REPLACE函数替换了cool codelang=' PHP/CPP/JavaScript/SQL/CSS等'下载='name' linenum='on/off '作为对应的[codelang=' PHP/CPP/JavaScript/SQL/CSS等']个别,从而节省编写程序、取出、替换等。Mysql只支持常规查询,不支持常规查询的替换。我们也可以构造联合嵌套的SQL来替换规则匹配的字符串,但是我们不能取出像PHP/CPP/JavaScript这样的语言标签,并用新的语言标签替换它们。也就是说,mysql不支持正则表达式的反向引用。PHP读取数据库,替换它,然后写入它。PHP的preg_replace函数支持反向引用(preg_replace不支持自定义组名的反向引用),所以我们要写一个查询语句,查询包含coolcode logo的文章,然后进行替换。当然,直接包含coolcode的文章可能太多了,我们也可以写一个MYSQL支持的POSIX正则引擎的表达式,用coolcode标签匹配文章,然后替换编写。从而减少物品的操作量。当然,正则表达式也浪费了很多资源。当然,当PHP代码的preg_replace函数使用上述正则性进行反向引用时,需要稍微修改一下正则性。在lang=' ' '中间给出一个组名。规律性修改为[\ [] coolcode [\ [\]] *?lang=\\?([a-z] \\?)'[^\[\]]*?[\]]PHP的替换代码是$ contents=preg _ replace('/[|[]cool code[[\]]*?' lang=\\\\?'([^'] ?)\\\\?'[^[\]]*?[|\]]/i ','[code lang='\\1 ',$ contents];常规I修饰符id不区分大小写。
另外,不要忘记coolcode和[/coolcode]的结束标记应该由[/code]替换。在mysql中执行两句sql复制代码如下: update WP _ post set post _ content=replace(post _ content,'/coolcode ','[\/code]');//注意后面有反斜杠。记得删除UPDATE WP _ POST SET POST _ CONTENT=REPLACE(POST _ CONTENT,'[/coolcode]','[\/code]');//注意后面有反斜杠,记得去掉摘要:本文中没有涉及正则表达式的高级用法,但都是常见且简单的用法。关于递归(迭代)、组命名、反向引用、零宽度断言等。在PCRE引擎正则表达式中,CFC4N会在未来找到合适的例子来编写。当然,这些高级用法,CFC4N,已经在为朋友写的正则表达式中使用过了。你可以看看。欢迎批评指点。PS:如果你需要一个完整的从coolcode到SyntaxHighlighter的PHP程序,只要留言,我会花时间写出来。
版权声明:解析coolcode到SyntaxHighlighter和Mysql正则表达式的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。