结合两个正则表达式

时间:2012-03-21 08:46:44

标签: javascript regex

我有一个关于用正则表达式完成某些事情的问题,即它是否可能,如果可能的话。

我正在做的简短摘要:我在线阅读漫画。我想在新标签中打开当前问题,但我并不总是记得点击中间点击链接。

所以我决定编写一个Greasemonkey脚本,可以在任何网站页面上运行target="_blank"添加 <language of manga>/<manga name> links to the main about page for the manga <language of manga>/<manga name>/<issue number> links to the issue number itself <language of manga>/<manga name>/<issue number>/<page number> links to the specific page of the issue 到任何引用漫画或漫画问题的锚标签,这样定期点击就可以打开它新标签。脚本本身工作正常,没什么了不起的。

现在进入警告:

我们称之为每个漫画的链接模式如下

    var MangaIssueRegex = /en-manga\/[A-Za-z0-9\-]+\//;
    var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+\/(\d+\/){2}/

现在我希望它始终在新选项卡中打开前两个但我不希望在新选项卡中打开最后一个。这样做的原因是当每次点击阅读实际的漫画以推进页面时会打开一个新标签。

所以要做到这一点,我有两个正则表达式:

    var MangaIssueRegex = /en-manga\/[A-Za-z0-9\-]+\//;
    var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+\/(\d+\/){2}/
    var elements = document.getElementsByTagName("a");
    for (var i = 0; i < elements.length; i++)
    {
      if (MangaIssueRegex.test(elements[i].getAttribute("href")) && !MangaIssuePageRegex.test(elements[i].getAttribute("href")))
      {
        elements[i].setAttribute("target","_blank");
        elements[i].setAttribute("title","Opens in another tab");
      }
    }

第一个正则表达式拾取了三个漫画链接模式中的任何一个。 第二个正则表达式只选取第三个漫画链接模式(特定页面的模式)

简而言之,Greasemonkey脚本在加载时遍历页面上的所有锚标记,如果锚标记的href属性通过MangaIssueRegex并且MangaIssuePageRegex失败,则锚标记被修改为在新标签中打开,否则锚标记未被修改。

现在是否可以将两个正则表达式组合成一个匹配前两个模式的表达式,但如果遇到第三个模式则会失败?

以下是整个脚本:

$("a")
  .filter(function(){return /en-manga\/[\w\-]+\/(\d+\/)?$/.test(this.href);})
  .each(function(index){$(this).attr({title:"Opens in new tab",target:"_blank"});});

更新

感谢@DanielHilgarth和@iMoses帮助我解决这个问题

我发现我可以在Greasemonkey中使用jQuery,所以最后这就是我最终的完整工作脚本

{{1}}

3 个答案:

答案 0 :(得分:3)

要仅匹配前两个模式,请尝试使用:

var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+\/(\d+\/)?$/

这将匹配:

<language of manga>/<manga name> 

以及:

<language of manga>/<manga name>/<issue number> 

如果您不想强制执行结束反斜杠,请改用此正则表达式:

var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+(\/\d+)?(\/)?$/

答案 1 :(得分:2)

你不能只在最后添加文本结束锚吗?

这样的事情:

/en-manga\/([A-Za-z0-9\-]+\/){1,2}$/

这将匹配

en-manga/asd/
en-manga/asd/12/

但不是

en-manga/asd/12/123/

您可以对其进行测试yourself

答案 2 :(得分:0)

看起来你希望匹配第一个正则表达式,在这种情况下尝试将其更改为:

var MangaIssueRegex = /en-manga\/[A-Za-z0-9\-]+\/?$/

http://jsfiddle.net/ZTGuB/1/