Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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中的BB代码正则表达式_Javascript_Regex_Bbcode - Fatal编程技术网

javascript中的BB代码正则表达式

javascript中的BB代码正则表达式,javascript,regex,bbcode,Javascript,Regex,Bbcode,我有一段代码: var s_1 = 'blabla [size=42]the answer[/size] bla bla blupblub'; var s_2 = 'blabla [size=42]the answer[/size] bla bla blupblub [size=32] 32 [/size]'; alert('Test-String:\n' + s_1 + '\n\nReplaced:\n' + size(s_1)); alert('Test-String:\n' + s_2

我有一段代码:

var s_1 = 'blabla [size=42]the answer[/size] bla bla blupblub';
var s_2 = 'blabla [size=42]the answer[/size] bla bla blupblub [size=32] 32 [/size]';

alert('Test-String:\n' + s_1 + '\n\nReplaced:\n' + size(s_1));
alert('Test-String:\n' + s_2 + '\n\nReplaced:\n' + size(s_2));


function size(s) {
    var reg = /\[size=(\d{1,2})\]([\u0000-\uFFFF]+)\[\/size\]/gi;
    s = s.replace(reg, function(match, p1, p2) {
        return '<span style="font-size: ' + ((parseInt(p1) > 48) ? '48' : p1) + 'px;">' + p2 + '</span>';
    })
    return s;    
}
var s_1='blabla[size=42]答案[/size]bla bla blupblub';
var s_2='blabla[size=42]答案[/size]bla bla blupblub[size=32]32[/size];
警报('Test-String:\n'+s_1+'\n\n替换为:\n'+size(s_1));
警报('Test-String:\n'+s_2+'\n\n替换为:\n'+size(s_2));
功能大小{
var reg=/\[size=(\d{1,2})\]([\u0000-\uFFFF]+)\[\/size\]/gi;
s=s.替换(reg,功能(匹配,p1,p2){
返回“+p2+”;
})
返回s;
}
它应该替换所有出现的“[size=nn][/size]”标记,但它只替换外部标记。我想不出怎么把它们全部替换掉。(请不要建议使用PHP脚本,我希望有一个BB代码格式化文本的实时预览)

我会尝试使用
([\u0000-\uFFFF]+?)
(未测试),这告诉我在第一次出现
[/size]
时停止,而不是直接进入最后一个

编辑


是的,经过测试,

您需要在
+
之后使用非贪婪表达式,由
限定

这和

var reg = /\[size=(\d{1,2})\](.+?)\[\/size\]/gi;
匹配(可能嵌套)BBCode标记 如果元素是嵌套的,则需要多通道方法。这可以通过以下两种方式之一实现:;从内到外匹配(不需要递归表达式),或从外到内匹配(需要递归表达式)。(另请参见我对一个类似问题的回答:)但是,由于Javascript正则表达式引擎不支持递归表达式,因此使用正则表达式(正确)实现这一点的唯一方法是从内到外。下面是一个经过测试的函数,它从内到外用SPAN html标记替换BBCode大小标记。请注意,下面的(fast)正则表达式是复杂的(一方面,它实现了Jeffrey Friedl的“展开循环”效率技术-请参阅:了解详细信息),在我看来,所有复杂正则表达式都应该进行彻底的注释和格式化,以确保可读性。由于Javascript没有自由间距模式,下面的正则表达式首先以PHP自由间距模式完整注释。实际使用的未注释js正则表达式与详细注释的正则表达式相同

要匹配最内层(可能是嵌套的)大小标记的正则表达式:
//注释(PHP字符串)格式的正则表达式。
$re='%#匹配最里面的[size=ddd]…[/size]结构。
\[size=#文字起始标记名,=。
(\d+)\]#$1:尺码号,结尾-“]”。
(#$2:元素内容。
#使用Friedls“展开循环”技术:
#开始:{normal*(特殊normal*)*}构造。
[^[]*{normal*}零或更多非-“[”。
(?:#开始{(特殊常态*)*}。
\[#{special}标记打开文字字符,
(?!#但仅当不开始
size=\d+\]\[size=ddd]打开标记
|\/size\]\或[/size]关闭标记。
)#结束消极前瞻。
[^[]*#更多{正常*}。
)*#完成{(特殊正常*)*}。
)#$2:元素内容。
\[\/size\]\\文字结束标记。
%九",;
Javascript函数:
parseSizeBBCode(文本)
函数parseSizeBBCode(文本){
//以下是javascript语法中相同的正则表达式:
变量re=/\[size=(\d+)\]([^[]*(?:\[(?!size=\d+\]\\\//size\])[^[]*)\[\/size\]/ig;
while(text.search(re)!=-1){
text=text.replace(关于“$2”);
}
返回文本;
}
输入示例:
r''
[size=10]尺寸为10的东西
[尺码=20]尺码20的东西
[size=30]尺码30的东西[/size]
[/size]
[/size]
'''
示例输出: <代码>r''' 10号的东西 20码的 30码的东西 ''' 免责声明-不要使用此解决方案! 请注意,使用regex解析BBCode充满了危险!(这里没有提到很多“gotchas”)。很多人会说这是不可能的。但是,我强烈反对,事实上我已经编写了一个完整的BBCode解析器(在PHP中),它使用递归正则表达式,运行非常好(而且速度很快)你可以在这里看到它的作用:(注意,它使用了一些不适用于心脏虚弱的药物)


但总的来说,我强烈警告不要使用正则表达式解析BBCode,除非你对正则表达式有非常深入和透彻的理解(这可以通过对正则表达式的仔细研究和实践获得)。换句话说,如果你不是正则表达式大师(即正则表达式大师),避免将它们用于除最琐碎的应用程序以外的任何应用程序。

啊,你从哪里得到的上箭头?我一直在使用
^
…只是开玩笑,但从未想过使用↑ :)@Gabber-使用
charmap
application:)如果您的标记是嵌套的,您将只能匹配最里面的标记,但您可以从内到外迭代地进行匹配。(使用PHP(具有递归表达式),您也可以从外到内进行匹配。)有关详细信息,请参阅。请注意,下面的答案都不能正确处理嵌套标记。
var reg = /\[size=(\d{1,2})\](.+?)\[\/size\]/gi;