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);