Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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
Regex BBcode:忽略(转义)特殊标记中的所有标记(在JavaScript中)_Javascript_Regex_Markdown_Bbcode - Fatal编程技术网

Regex BBcode:忽略(转义)特殊标记中的所有标记(在JavaScript中)

Regex BBcode:忽略(转义)特殊标记中的所有标记(在JavaScript中),javascript,regex,markdown,bbcode,Javascript,Regex,Markdown,Bbcode,我正在用一组标记和替换来解析一些文本。例如,要使文本**由双星号**加粗包围,我使用/\*\*([\s\s]+?)\*\*/gm作为图案,使用“$1”作为替换。但我想提供的是原始文本,就像我在这个问题上做的一样。因此,我需要一个表达式,它“匹配任何字符,包括由双星号包围的空格和换行符,但不由反勾号包围,反勾号和双星号之间有(可选)字符/空格/换行符” 示例。 输入字符串:“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”

我正在用一组标记和替换来解析一些文本。例如,要使文本
**由双星号**
加粗包围,我使用
/\*\*([\s\s]+?)\*\*/gm
作为图案,使用
“$1”
作为替换。但我想提供的是原始文本,就像我在这个问题上做的一样。因此,我需要一个表达式,它“匹配任何字符,包括由双星号包围的空格和换行符,但不由反勾号包围,反勾号和双星号之间有(可选)字符/空格/换行符”

示例。

输入字符串:
“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”

结果:“Lorem ipsum**dolor**sit amet,concerteturadipising elit”


我尝试了不匹配的组和lookaheads,但没有效果。我知道这可以通过例如用html实体替换字符或仅仅使用一些标记解析器来实现,但出于兴趣,如何通过纯正则表达式魔术来实现呢?

使用lookbehind断言,生活会更简单

/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm

如果第一个组为空,则最后一个组将匹配空字符串

然后我们过滤结果

var str = "Lorem `ipsum **dolor** sit` amet, **consectetur** adipisicing elit dolor `**sit amet**` adi";

str = str.replace(/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm, function(m, p1, p2, p3, p4){
    return p1 && p4 ? m : "<b>" + p3 + "</b>";
});
var str=“Lorem`ipsum**dolor**sit`amet,**concetetur**adipising elite dolor`**sit amet**adi”;
str=str.replace(/((`)[\s\s]*?)?\***([\s\s]+?)\****([\s\s]*?\2)/gm,函数(m,p1,p2,p3,p4){
返回p1和p4?m:“+p3+”;
});

返回p1和p4?m:”“+p3+”“;
如果
p1
p4
不是空的/未定义的,这意味着我们匹配的字符串以反勾号开始和结束。我们不做任何更改就退回它

此示例输出:

Lorem`ipsum**dolor**sit`amet,奉献告别精英 多洛`**坐在我身边**`adi

在我看来,这有点棘手。但正如你所指出的,这只是为了兴趣

类似这样的话:
“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”
Dolor
不应变为粗体,因为
ipsum**Dolor**sit
被反勾号包围(我在这里使用双反勾号只是为了转义它们),而concertetur与表达式匹配并变为黑色。
var str = "Lorem `ipsum **dolor** sit` amet, **consectetur** adipisicing elit dolor `**sit amet**` adi";

str = str.replace(/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm, function(m, p1, p2, p3, p4){
    return p1 && p4 ? m : "<b>" + p3 + "</b>";
});
return p1 && p4 ? m : "<b>" + p3 + "</b>";