繁体   English   中英

应该使用哪个正则表达式用HTML标记替换bbcode样式的标记

[英]Which regexp should be used to replace bbcode-style tags with HTML tags

我想替换一些特定的字母(got from user input)以替换为特定的html标签,例如<b>,<u>,<i>,etc 我在javascript中使用了一些正则表达式,但无法确定哪种使用最好。 我在用

/\[u\](.*?)\[u\]/g // replace with <u>$1</u>
/*
 * if i type [u]underline[][u] //this allows '[]' braces
*/

还是我应该使用

/\[u\]\([^\[u\]]+)\[u\]/g // this doesn't allow third braces to be underlined

我也在php中使用相同的正则表达式。 我很困惑哪种类型的正则表达式可以免受xss攻击。

不应使用正则表达式。 找到一个不错的bbcode解析器(例如PHP的BBCode )并使用它。 自己尝试用Regex解析HTML或任何已建立的标记语言的过程中,会带来痛苦,麻烦和不安全感。

bobince写了一个关于用正则表达式解析HTML的史诗般的答案 ,这在这里也很重要,并且总是值得一读。

您询问是否使用/\\[u\\](.*?)\\[u\\]/g/\\[u\\]\\([^\\[u\\]]+)\\[u\\]/g 两种模式均未设计有结尾标签,这一点很重要。 [u]underlined text[/u]BBCode

使用扩展正则表达式的解决方案可能是使用递归模式 我认为JavaScript还没有支持 ,但是可以正常使用,例如,使用PCRE的 PHP

问题: 标签可以嵌套 ,这将使其难以匹配最外层的标签


了解此PHP示例中以下模式的作用:

$str = 
'The [u][u][u]young[/u] quick[/u] brown[/u] fox jumps over the [u]lazy dog[/u]';

1.)使用非贪心 匹配 [u]...[/u]中的任何字符

$pattern = '~\[u\](.*?)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);

输出

The <u>[u][u]young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>

查找[u]的第一个出现,并吃掉尽可能少的字符以满足条件[/u] ,这会导致标签不匹配。 因此,这是一个不好的选择。


2.)对[u]...[/u]内的内容使用方括号 [^[\\]] 取反

$pattern = '~\[u\]([^[\]]*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);

输出

The [u][u]<u>young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>

它看起来为第一次出现的[u]随后的任何字符的量,即不[]满足条件[/u] 它“更安全”,因为它只匹配最内层的元素,但仍然需要付出额外的努力才能从内而外解决。


3.)对[u]...[/u]内的内容使用递归 +方括号[^[\\]] 否定

$pattern = '~\[u\]((?:[^[\]]+|(?R))*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);

输出

The <u>[u][u]young[/u] quick[/u] brown</u> fox jumps over the <u>lazy dog</u>

与第二种模式类似:查找[u]的第一次出现,然后匹配一个或多个不是[]字符,或将整个模式粘贴(?R) 整个事情执行零次或多次,直到条件[/u]匹配为止。

为了摆脱里面尚未解决的bb-tag,我们现在可以轻松地将其删除:

$str = preg_replace('~\[/?u\]~',"",$str);

并按需获得:

输出The <u>young quick brown</u> fox jumps over the <u>lazy dog</u>

当然,有多种方法可以实现它,例如preg replace回调,或者对于JavaScript而言,可以使用回调作为替代的replace()方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM