正则表达式,不停止匹配
Regex, doesnt stop matching
我正在研究一个 bbcode 示例,但我似乎无法让它工作。
正则表达式匹配所有 [img] 标签并使它看起来很奇怪。我正在尝试选择单击图像并获得全尺寸的选项,当我这样做时,一切都变成了 link(当我有不止一次 img-tag 时)。
这是我的文字:
[img size="small" clickable="no"]img1.jpg[/img]
[img size="large" clickable="yes"]img2.jpg[/img]
这是我的源代码:
var bbArray = [/\n/g,
/\[img size="(.*?)" clickable="yes"\](.*?)\[\/img\]/g,
/\[img size="(.*?)" clickable="no"\](.*?)\[\/img\]/g];
var bbReplace = ['<br>',
'<a href="'+path+'img/" target="_blank"><img src="'+path+'img/_?'+ new Date().getTime() +'" alt=""></a>',
'<img src="'+path+'img/_?'+ new Date().getTime() +'" alt="">'];
操作:
for (var i = 0; i < content_text_bb.length; i++) {
content_text_bb = content_text_bb.replace(bbArray[i], bbReplace[i]);
}
结果:
<img src="localhost/img/small" clickable="no" ]img1.jpg[="" img]
[img size="large_img2.jpg?1423317485160" alt="img2.jpg">;
我对正则表达式不太熟悉,我真的需要有人看一下,我迷路了。
首先,你的循环应该是:
for (var i = 0; i < bbArray.length; i++) {
(不是content_text_bb.length)
其次,您遇到的问题是这个 size="(.*?)
。这表示:非贪婪地匹配任何内容,直到我找到第一个 "thing-that-follow" (在这种情况下,接下来的事情是 " clickable="yes"
的第一次出现
如果您查看您的输入文本,搜索 [img size="{ANYTHING}" clickable="yes"]
意味着 {ANYTHING} 是:small" clickable="no"]img1.jpg[/img][img size="large
您可以看到 returns 您的结果是如何破坏一切的.
因此,首先应该注意的是,正则表达式 不是 语言处理的最佳工具(关于该主题的大量帖子和互联网)。在这种特殊情况下,您可以通过非常具体地说明您想要匹配的内容来解决您的问题。
不匹配 "anything"。如果要匹配尺寸属性,请仅查找数字。如果要匹配任何 属性 值,请查找“{ANYTHING_NOT_DOUBLE_QUOTES}”。因此,话虽如此,如果您将 bbArray 更改为以下代码,它应该可以在您提供给我们的特定示例中使用:
var bbArray = [/\n/g,
/\[img size="([^"]*)" clickable="yes"\](.*?)\[\/img\]/g,
/\[img size="([^"]*)" clickable="no"\](.*?)\[\/img\]/g];
明确一点:虽然这应该适用于您当前的输入,但它绝不是强大的 bbcode 处理。它只会匹配 [img]
具有 exactly 一个 size
属性和一个 clickable
属性的 bbcode 标签,按此顺序!!大多数免费输入的 bbcode 都会有更广泛的变化,而这段代码显然不适用于它们。
您可能感兴趣的内容,Extendible BBCode Parser。使用示例。
var bbcArr = [
'[img size="small" clickable="no"]img1.jpg[/img]',
'[img size="large" clickable="yes"]img2.jpg[/img]'
];
XBBCODE.addTags({
"img": {
openTag: function(params, content) {
params = (params.match(/(\S+?=".*?")/g) || [])
.reduce(function(opts, item) {
var pair = item.match(/(\S+?)="(.*?)"/);
opts[pair[1]] = pair[2];
return opts;
}, {});
var html = '<img src="http://localhost/img/';
if (params.clickable === 'yes') {
html = '<a href="http://localhost/img/' + content +
'" alt="' + content + '">' + html;
}
if (params.size === 'small' || params.size === 'large') {
html += params.size + '/';
}
html += content + '" />';
if (params.clickable === 'yes') {
html += '</a>';
}
return html;
},
closeTag: function(params, content) {
return '';
},
displayContent: false
}
});
bbcArr.forEach(function(item) {
var result = XBBCODE.process({
text: item,
removeMisalignedTags: false,
addInLineBreaks: false
});
this.appendChild(document.createTextNode(result.html + '\n'));
}, document.getElementById('out'));
<script src="https://rawgithub.com/patorjk/Extendible-BBCode-Parser/master/xbbcode.js"></script>
<pre id="out"></pre>
我正在研究一个 bbcode 示例,但我似乎无法让它工作。 正则表达式匹配所有 [img] 标签并使它看起来很奇怪。我正在尝试选择单击图像并获得全尺寸的选项,当我这样做时,一切都变成了 link(当我有不止一次 img-tag 时)。
这是我的文字:
[img size="small" clickable="no"]img1.jpg[/img]
[img size="large" clickable="yes"]img2.jpg[/img]
这是我的源代码:
var bbArray = [/\n/g,
/\[img size="(.*?)" clickable="yes"\](.*?)\[\/img\]/g,
/\[img size="(.*?)" clickable="no"\](.*?)\[\/img\]/g];
var bbReplace = ['<br>',
'<a href="'+path+'img/" target="_blank"><img src="'+path+'img/_?'+ new Date().getTime() +'" alt=""></a>',
'<img src="'+path+'img/_?'+ new Date().getTime() +'" alt="">'];
操作:
for (var i = 0; i < content_text_bb.length; i++) {
content_text_bb = content_text_bb.replace(bbArray[i], bbReplace[i]);
}
结果:
<img src="localhost/img/small" clickable="no" ]img1.jpg[="" img]
[img size="large_img2.jpg?1423317485160" alt="img2.jpg">;
我对正则表达式不太熟悉,我真的需要有人看一下,我迷路了。
首先,你的循环应该是:
for (var i = 0; i < bbArray.length; i++) {
(不是content_text_bb.length)
其次,您遇到的问题是这个 size="(.*?)
。这表示:非贪婪地匹配任何内容,直到我找到第一个 "thing-that-follow" (在这种情况下,接下来的事情是 " clickable="yes"
如果您查看您的输入文本,搜索 [img size="{ANYTHING}" clickable="yes"]
意味着 {ANYTHING} 是:small" clickable="no"]img1.jpg[/img][img size="large
您可以看到 returns 您的结果是如何破坏一切的.
因此,首先应该注意的是,正则表达式 不是 语言处理的最佳工具(关于该主题的大量帖子和互联网)。在这种特殊情况下,您可以通过非常具体地说明您想要匹配的内容来解决您的问题。
不匹配 "anything"。如果要匹配尺寸属性,请仅查找数字。如果要匹配任何 属性 值,请查找“{ANYTHING_NOT_DOUBLE_QUOTES}”。因此,话虽如此,如果您将 bbArray 更改为以下代码,它应该可以在您提供给我们的特定示例中使用:
var bbArray = [/\n/g,
/\[img size="([^"]*)" clickable="yes"\](.*?)\[\/img\]/g,
/\[img size="([^"]*)" clickable="no"\](.*?)\[\/img\]/g];
明确一点:虽然这应该适用于您当前的输入,但它绝不是强大的 bbcode 处理。它只会匹配 [img]
具有 exactly 一个 size
属性和一个 clickable
属性的 bbcode 标签,按此顺序!!大多数免费输入的 bbcode 都会有更广泛的变化,而这段代码显然不适用于它们。
您可能感兴趣的内容,Extendible BBCode Parser。使用示例。
var bbcArr = [
'[img size="small" clickable="no"]img1.jpg[/img]',
'[img size="large" clickable="yes"]img2.jpg[/img]'
];
XBBCODE.addTags({
"img": {
openTag: function(params, content) {
params = (params.match(/(\S+?=".*?")/g) || [])
.reduce(function(opts, item) {
var pair = item.match(/(\S+?)="(.*?)"/);
opts[pair[1]] = pair[2];
return opts;
}, {});
var html = '<img src="http://localhost/img/';
if (params.clickable === 'yes') {
html = '<a href="http://localhost/img/' + content +
'" alt="' + content + '">' + html;
}
if (params.size === 'small' || params.size === 'large') {
html += params.size + '/';
}
html += content + '" />';
if (params.clickable === 'yes') {
html += '</a>';
}
return html;
},
closeTag: function(params, content) {
return '';
},
displayContent: false
}
});
bbcArr.forEach(function(item) {
var result = XBBCODE.process({
text: item,
removeMisalignedTags: false,
addInLineBreaks: false
});
this.appendChild(document.createTextNode(result.html + '\n'));
}, document.getElementById('out'));
<script src="https://rawgithub.com/patorjk/Extendible-BBCode-Parser/master/xbbcode.js"></script>
<pre id="out"></pre>