【问题标题】:bbcode unparser regex helpbbcode unparser 正则表达式帮助
【发布时间】:2011-03-17 09:24:07
【问题描述】:

我有这个函数来解析 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 -> bbcode?​​p>

我的正则表达式技能很差:(

谢谢。

【问题讨论】:

    标签: php regex parsing bbcode


    【解决方案1】:

    不要。

    相反,存储原始未解析文本和处理解析文本。是的,这使存储需求翻了一番,但它也使以下操作变得非常容易:

    1. 允许用户在不解析 BBCode 的情况下编辑原始文件
    2. 允许引用其他用户帖子,同样无需解析
    3. 更改每个 BBCode 生成的 HTML(只需重新解析每个帖子)
    4. 下线切换 BBCode 引擎(同样,只需重新解析每个帖子)

    【讨论】:

    • +1 如果数据确实以 BBCode 格式提供,这将是更可取的。
    • 谢谢,我认为这比我最初想的要好。
    【解决方案2】:

    可以肯定地说,仅使用大量正则表达式就几乎不可能构建一种可靠 将 html 转换为 bbcode 的方法。使用解析器(例如 DOMDocument),使用 xpath 的 & 检查删除无效元素和属性,然后递归地遍历它,在途中创建一个 bbcode 字符串(或者只是在途中忽略无效标签/属性)。

    【讨论】:

    • 谢谢!小马托尼不会来。
    • 呃,想澄清一下吗? “小马托尼不会来的。”对我来说有点神秘;)
    • 由于 BBCODE 与 HTML 一样具有递归结构,因此适用:*.com/a/1732454/193892
    • 在答案的底部,您会发现 tony the pony aka cthulhu。
    【解决方案3】:

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

    将你传递的两个数组切换为preg_replace

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

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

    这应该可以。如果有任何问题:询问;)

    【讨论】: