bbcode unparser正则表达式的帮助

时间:2010-07-17 17:02:44

标签: php regex parsing bbcode

我有这个功能来解析bbcode - > HTML:

  $this->text = preg_replace(array(
    '/\[b\](.*?)\[\/b\]/ms', 
    '/\[i\](.*?)\[\/i\]/ms',
    '/\[u\](.*?)\[\/u\]/ms',
    '/\[img\](.*?)\[\/img\]/ms',
    '/\[email\](.*?)\[\/email\]/ms',
    '/\[url\="?(.*?)"?\](.*?)\[\/url\]/ms',
    '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms',
    '/\[youtube\](.*?)\[\/youtube\]/ms',
    '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms',    
    '/\[quote](.*?)\[\/quote\]/ms',
    '/\[list\=(.*?)\](.*?)\[\/list\]/ms',
    '/\[list\](.*?)\[\/list\]/ms',
    '/\[\*\]\s?(.*?)\n/ms'
   ),array(
    '<strong>\1</strong>',
    '<em>\1</em>',
    '<u>\1</u>',
    '<img src="\1" alt="\1" />',
    '<a href="mailto:\1">\1</a>',
    '<a href="\1">\2</a>',
    '<span style="font-size:\1%">\2</span>',
    '<object width="450" height="350"><param name="movie" value="\1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="\1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="350"></embed></object>',
    '<span style="color:\1">\2</span>',
    '<blockquote>\1</blockquote>',
    '<ol start="\1">\2</ol>',
    '<ul>\1</ul>',
    '<li>\1</li>'
   ),$original);

问题是,如何解析这个,比如html - &gt;设置高亮?

我的正则表达能力差:(

感谢。

3 个答案:

答案 0 :(得分:7)

别。

而是存储原始未解析文本和已处理解析文本。是的,这使存储需求增加了一倍,但它也使得它非常容易:

  1. 允许用户编辑原文而不解析BBCode
  2. 允许引用其他用户帖子,无需解析
  3. 更改每个BBCode生成的HTML(只需重新解析每个帖子)
  4. 切换BBCode引擎(再次,只需重新解析每个帖子)

答案 1 :(得分:5)

可以很自然地说,建立一个可靠的方法几乎不可能只用一大堆正则表达式将html转换为bbcode。使用解析器(例如DOMDocument),删除无效元素&amp; xpath&amp;的属性检查然后递归地在路上创建一个bbcode字符串(或者只是忽略无效的标签/属性)。

答案 2 :(得分:3)

如果您确切地知道要使用您的方法编码您想要解码的HTML代码,请执行以下操作:

将您传递的两个数组切换到preg_replace

在包含HTML代码的数组中,对每个元素执行以下操作:将#添加到字符串中。附加#s。将\1(和\2 aso)替换为(.*?)

对于带有bbcodes的数组,请执行以下每个元素:在开头删除/,在结尾删除/ms。将\s替换为。删除所有\。删除所有?。将字符串中的第一个(.*)替换为$1,将第二个$2替换为{{1}}。

这应该做。如果有任何问题:问;)