正则表达式,不停止匹配

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>