正则表达式,查找不以="开头的URL's

RegEx, look for URL's where it does not start with ="

本文关键字:URL 开头 quot 查找 正则表达式      更新时间:2023-09-26

我正试图建立一个函数来查找URL的字符串,并将其更改为链接。但我不想找到已经在HTML标签内的URL(如<A><IMG>为例)。

换句话说,RegEx应该找到这个并将其替换为链接:

http://www.stackoverflow.com
www.stackoverflow.com
www.stackoverflow.com/logo.gif

但不包括这些URL(因为它们已经格式化了):

<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
<img src="http://www.stackoverflow.com/logo.gif">

我正在使用已经为此开发的RegEx,但它不检查URL是否已经在html元素内。(http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without)

这是原始的RegEx:

/((([A-Za-z]{3,9}:(?:'/'/)?)(?:['-;:&='+'$,'w]+@)?[A-Za-z0-9'.'-]+|(?:www'.|['-;:&='+'$,'w]+@)[A-Za-z0-9'.'-]+)((?:'/['+~%'/'.'w'-_]*)?'??(?:['-'+=&;%@'.'w_]*)#?(?:['.'!'/'''w]*))?)/

这是相同的RegEx,有解释:

(
  ( // brackets covering match for protocol (optional) and domain
    ([A-Za-z]{3,9}:(?:'/'/)?) // match protocol, allow in format http:// or mailto:
    (?:['-;:&='+'$,'w]+@)? // allow something@ for email addresses
    [A-Za-z0-9'.'-]+ // anything looking at all like a domain, non-unicode domains
    | // or instead of above
    (?:www'.|['-;:&='+'$,'w]+@) // starting with something@ or www.
    [A-Za-z0-9'.'-]+   // anything looking at all like a domain
  )
  ( // brackets covering match for path, query string and anchor
    (?:'/['+~%'/'.'w'-]*) // allow optional /path
    ?'??(?:['-'+=&;%@'.'w]*) // allow optional query string starting with ? 
    #?(?:['.'!'/'''w]*) // allow optional anchor #anchor
  )? // make URL suffix optional
)

我要做的是改变这一点,以寻找URL是否以确切的=">开始,如果它这样做,它不应该通过RegEx。因为<A><IMG>元素中的URL在开始之前应该有这些组合之一。

我不是RegEx中最伟大的,但我已经尝试过了,我想这是我迄今为止最好的尝试,但它没有做到这一点:

/(((^[^'="|'>])([A-Za-z]{3,9}:(?:'/'/)?)(?:['-;:&='+'$,'w]+@)?[A-Za-z0-9'.'-]+|(?:www'.|['-;:&='+'$,'w]+@)[A-Za-z0-9'.'-]+)((?:'/['+~%'/'.'w'-]*)?'??(?:['-'+=&;%@'.'w]*)#?(?:['.'!'/'''w]*))?)/g;

我添加的是这一部分:

(^[^'="|'>])

这是我的小提琴:

http://jsfiddle.net/0w1g4mm9/2/

你可以尝试这样做:

string.replace(
  /(<a[^>]*>[^>]*<'a>)|YOUR_REGEX_HERE/g,
  function(match, link, YOUR_CAPTURE_GROUP_1, etc) {
    if (link) {
        return link
    }
    return YOUR_DESIRED_REPLACEMENT
  }
)

上面匹配已经有效的<a>标记或您需要查找的url字符串都在寻找,先出现的那个。抓包组用于检测哪一个是匹配的?如果匹配到一个有效的链接,只需返回它修改的。否则返回所需的替换项。

一种不同的方法,有点难看。我遍历所有匹配,重建非匹配的源html,对于匹配,我检查matchIndex - 1的字符,并添加链接标签或不。

这样做的好处是,已经非常复杂的正则表达式不会变得更复杂,你可以使用完整的javascript来检查当前字符串是否是html元素的一部分。

如果你提出迭代代码,它甚至可能最终看起来不错。

var urlRegEx = /((([A-Za-z]{3,9}:(?:'/'/)?)(?:['-;:&='+'$,'w]+@)?[A-Za-z0-9'.'-]+|(?:www'.|['-;:&='+'$,'w]+@)[A-Za-z0-9'.'-]+)((?:'/['+~%'/'.'w'-]*)?'??(?:['-'+=&;%@'.'w]*)#?(?:['.'!'/'''w]*))?)/g;
var source = $('#source').html();
var dest = "";
var lastMatchEnd = 0;
while ((match = urlRegEx.exec(source)) != null) {
  dest += source.substring(lastMatchEnd, match.index);
  var end = match.index + match[0].length;
  var lastChar = source.charAt(match.index - 1);
  if(lastChar == '"' || lastChar == '>') { // inside link
    dest += match[0];
  } else {
    dest += "<a href=''>" + match[0] + "</a>";
  }
  lastMatchEnd = end;
}
dest += source.substring(lastMatchEnd);
$('#target').html(dest);