将 BBCode 生成的 HTML 转换回 BBCode

问题描述 投票:0回答:3

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

php html regex parsing bbcode
3个回答
7
投票

不要。

相反,存储原始未解析的文本和处理的解析的文本。是的,这使存储要求增加了一倍,但也使其非常容易:

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

5
投票

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


3
投票

交换你传递给的两个数组

preg_replace


在包含 HTML 代码的数组中,对每个元素执行以下操作:在字符串前面添加

#

。追加

#s
。将
\1
(以及
\2
)替换为
(.*?)

对于带有 bbcode 的数组,对每个元素执行以下操作:删除开头的

/

和末尾的

/ms
。将
\s
替换为
。删除所有
\
。删除所有
?
。将字符串中的第一个
(.*)
替换为
$1
,将第二个替换为
$2

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

© www.soinside.com 2019 - 2024. All rights reserved.