将 BBCode 生成的 HTML 转换回 BBCode

发布于 2024-09-10 11:09:30 字数 1523 浏览 8 评论 0原文

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

I have this function to parse 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
);

Problem is, how to unparse this, like html -> bbcode?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鲸落 2024-09-17 11:09:30

不。

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

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

Don't.

Instead, store both the original unparsed text and the processed parsed text. Yes, this doubles the storage requirement, but it also makes it blindingly easy to:

  1. Allow user edits of the original without parsing the BBCode back out
  2. Allow quotes of other user posts, again without parsing
  3. Change the HTML each BBCode generates (just re-parse every post)
  4. Switch BBCode engines down the line (again, just re-parse every post)
二智少女猫性小仙女 2024-09-17 11:09:30

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

It's pretty safe to say it's nigh impossible to build a reliable way to convert html to bbcode with just a slew of regexes. Use a parser (DOMDocument for instance), remove invalid elements & attributes with xpath's & inspection and then recursively walk it creating a bbcode string on the way (or just ignore invalid tags / attributes on the way).

清欢 2024-09-17 11:09:30

如果您确切地知道您想要反 bbcode 的 HTML 代码是使用您的方法进行了 en-bbcode 的,则执行以下操作:将

您传递给 preg_replace 的两个数组切换。

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

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

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

If you know exactly that the HTML code you want to de-bbcode was en-bbcoded using your method, than do the following:

Switch the two array you pass to preg_replace.

In the array with the HTML code, do the following for every element: Prepend # to the string. Append #s. Replace \1 (and \2 aso) with (.*?).

For the array with the bbcodes do thefollowing with every element: Remove / at the beginning and /ms at end. Replace \s with . Remove all \. Remove all ?. Replace the first (.*) in the string with $1 and the second with $2.

This should do. If any problems: Ask ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文