Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript replace()使用多个html替换多个bbcode实例_Javascript_Html_Replace_Bbcode - Fatal编程技术网

javascript replace()使用多个html替换多个bbcode实例

javascript replace()使用多个html替换多个bbcode实例,javascript,html,replace,bbcode,Javascript,Html,Replace,Bbcode,我需要使用javascript replace()函数将[b]或[/b]的每个实例替换为或。我试着用全球标签来做这个,但它不起作用,结果很奇怪: document.write(str.replace(/[b]/g,'<b>').replace(/[/b]/g,'</b>')); 我知道这里可能有一些明显的东西我遗漏了。。。但是我找不到它。。。任何帮助,我都会永远爱你 [a]表示:匹配任何a字符[abcd]表示:匹配一个字符,即a、b、c、d中的一个[a-z]表示:匹配

我需要使用javascript replace()函数将[b]或[/b]的每个实例替换为
。我试着用全球标签来做这个,但它不起作用,结果很奇怪:

document.write(str.replace(/[b]/g,'<b>').replace(/[/b]/g,'</b>'));

我知道这里可能有一些明显的东西我遗漏了。。。但是我找不到它。。。任何帮助,我都会永远爱你

  • [a]
    表示:匹配任何
    a
    字符<代码>[abcd]表示:匹配一个字符,即a、b、c、d中的一个<代码>[a-z]表示:匹配任何字母
  • /
    用于标记RegExp的开始和结束
要使用文字字符,必须对其进行转义

str.replace(/\[b\]/g,'<b>').replace(/\[\/b\]/g,'</b>')
str.replace(/\[b\]/g')。replace(/\[\/b\]/g'))
请注意,可以使用反向引用合并这两个正则表达式:

str.replace(/\[(\/?)b\]/g,'<$1b>')
// Replaces [b] with <b>, [/b] with </b>
str.replace(/\[(\/?)b\]/g',)
//将[b]替换为,[/b]替换为

您最好同时更换两个:

 str = "[b]foo[/b] and [b]bar[/b]"
 str.replace(/\[b\](.+?)\[\/b\]/g,'<b>$1</b>') // <b>foo</b> and <b>bar</b>
str=“[b]foo[/b]和[b]bar[/b]”
str.replace(/\[b\](.+?)\[\/b\]/g,$1')///foo和bar
您还可以更进一步,用一个正则表达式处理多个格式化代码(本例中为b、i、u和s):

str = "[b]foo[/b] and [i]bar[/i]"
str.replace(/\[([bius])\](.+?)\[\/\1\]/g,'<$1>$2</$1>')
str=“[b]foo[/b]和[i]bar[/i]”
str.replace(/\[([bius])\](.+?)\[\/\1\]/g,“$2”)

像这样的表达式(带有
(.+?)
)比您的表达式更好,因为它们只处理有效的标记,而忽略未关闭的[tags]

如果要嵌套相同类型的BB代码元素,这将不起作用。例如,如果列表中有列表,它将跳过标记
[li][ul][li][/li][/ul][/li][/code>将第一个
[li][/code>与第一个
[/li][/code>匹配,第二个
[li]
保留在适当的位置,并且除非运行两次替换操作,否则无法匹配。@benjaminudincate:当然,您不能仅使用正则表达式解析嵌套标记,至少在javascript中是这样,它缺少递归构造。不过,我认为我的解决方案对OP的要求“足够好”,显然比你的例子要简单得多。谢谢!我以前在某处看到过(+?)部分,但看不清它们的用途(我认为它们是正在被更改的内容的一部分或其他内容……代码工作得很好,您为我省去了为各种bbcode编写一个代码的麻烦:I抱歉,进一步麻烦您,但您能否告诉我如何将任何Enter替换为
以及类似[引用]之类的内容替换为html等价物?我认为替换BIU只会导致它替换任何q、u、o、t或e…是的,嵌套不是真正的问题atm XD这要简单得多:P@user1054798
+?
匹配不够。例如,它不包括换行符。您必须使用
[\S\S]+?
,它匹配所有字符。对于BB解析器,一个简单的RegExp是不够的。我以前写过一个运行良好的JavaScript BBCode解析器(代码脱机),但是(部分)逻辑发布在。您建议我使用+?而不是.+?然后不带括号吗?我会检查解析器,谢谢:)感谢您提供有关特殊字符的信息,请注意^-^我希望我能正确选择这两个答案!@user1054798您可以接受最有帮助的答案(=解决了您的问题,最好有明确的解释)。此答案应该是问题帖子中发布的核心问题的答案。此外,您可以对帖子进行升级投票,这些帖子也非常有用,例如奖金提示。我没有必要的声誉来升级投票,但我的目标是在我达到时对所有问题进行升级:D我将使用发布的所有解决方案再测试一点,看看这对我的需求来说是最有效的!是的,当我看到代表增加的时候,D就不想再张贴了,一些论坛认为这是一个讨厌的事情…
str.replace(/\[(\/?)b\]/g,'<$1b>')
// Replaces [b] with <b>, [/b] with </b>
 str = "[b]foo[/b] and [b]bar[/b]"
 str.replace(/\[b\](.+?)\[\/b\]/g,'<b>$1</b>') // <b>foo</b> and <b>bar</b>
str = "[b]foo[/b] and [i]bar[/i]"
str.replace(/\[([bius])\](.+?)\[\/\1\]/g,'<$1>$2</$1>')