[英]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
攻击。
您询问是否使用/\\[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.