将 BBCode 生成的 HTML 转换回 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 -> 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不。
相反,存储原始未解析的文本和处理已解析的文本。是的,这使存储要求增加了一倍,但它也使其非常容易:
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:
可以肯定地说,仅使用大量正则表达式构建一种可靠的将 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).
如果您确切地知道您想要反 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 ;)