Javascript 应该使用哪个regexp将bbcode样式标记替换为HTML标记

Javascript 应该使用哪个regexp将bbcode样式标记替换为HTML标记,javascript,php,html,regex,bbcode,Javascript,Php,Html,Regex,Bbcode,我想替换一些特定的字母(从用户输入中获取)以替换一些特定的html标记,如,,等。我在javascript中使用了一些正则表达式,但不知道哪种用法最好。我正在使用 /\[u\](.*?)\[u\]/g // replace with <u>$1</u> /* * if i type [u]underline[][u] //this allows '[]' braces */ 我还在php中使用相同的regexp。我不知道使用哪种类型的regexp可以防止xss攻击。不

我想替换一些特定的字母
(从用户输入中获取)
以替换一些特定的html标记,如
,,等
。我在javascript中使用了一些正则表达式,但不知道哪种用法最好。我正在使用

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

我还在php中使用相同的regexp。我不知道使用哪种类型的regexp可以防止
xss
攻击。

不应该使用regex。找到一个像样的bbcode解析器(例如PHP)并使用它。试图自己用正则表达式解析HTML或任何已建立的标记语言都会带来痛苦、麻烦和不安全感


bobince写了一篇关于用正则表达式解析HTML的文章,这篇文章在这里也很相关,而且总是值得一读。

你问,是使用
/\[u\](.*?\[u\]/g
还是
/\[u\]\[u\]+)\[u\]/g
。这两种模式都没有设计结束标记,这一点很重要<代码>[u]下划线文本[/u]为

使用扩展正则表达式的解决方案可以是使用。我认为有,但效果很好,例如使用PHP

问题是:标记可以嵌套,这将使匹配最外层标记变得困难


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

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

产出:

那只敏捷的小狐狸跳过了那只懒狗

它查找第一次出现的
[u]
,后跟任何数量的字符,这些字符不是
[
]
,以满足条件
[/u]
。它“更安全”,因为它只匹配最里面的元素,但仍然需要额外的努力才能从内到外解决这个问题


3.
[u]…[/u]
中的内容使用方括号的递归

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

产出:
小而敏捷的棕色狐狸跳过了懒狗


当然,有不同的实现方法,比如JavaScript,可以使用回调作为替代。

我编辑了一些说明,但这并不重要。您正试图为一种已有的标记语言编写自己的解析器,这种语言有很多小细节和缺陷。只要学习和使用一些经过测试和使用良好的东西,你就可以节省时间,而且它会更安全,更少bug。顺便说一句,我的答案最初是面向HTML的原因是,你的标题(在我编辑它之前)暗示你在解析HTML。我返回并编辑它以引用bbcode,但在我的回答中错过了对HTML的第三次引用。bbcode不是一种常规语言。您不应该尝试使用正则表达式来解析它。从github获取bbcode解析器或编写自己的解析器。
$pattern = '~\[u\]([^[\]]*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
$pattern = '~\[u\]((?:[^[\]]+|(?R))*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
$str = preg_replace('~\[/?u\]~',"",$str);