正则表达式,查找不以="开头的URL's
RegEx, look for URL's where it does not start with ="
我正试图建立一个函数来查找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);
- 如何使用url加载程序在webpack中导入多个图像
- 使用php或javascript从facebook相册URL中删除多余的部分
- 当URL以m.(网站).com开头时,浏览器需要自行调整大小
- Greasemonkey - 如何在以特定字符串开头的页面上查找并打开 aν URL
- 为什么使用MEAN.js应用程序'URL以#开头
- 正则表达式,用于匹配字符串开头的协议相对 URL
- jquery 正则表达式修剪 URL 字符串的开头和结尾
- 缩短 URL 以保留开头和结尾(Firebug “Net” 面板样式)
- 花式框 - URL 以“/”开头的语法错误
- 如何验证正斜杠并将其转换为 url 的开头
- 当将 JavaScript 与 Webpack 捆绑在一起时,require/import URL 开头的 @ 符号是什
- 删除URL开头的字符串
- 我怎么能在一个URL中有两种类型的参数,其中一种以“”开头#"而另一个以“0”开头&"并且不替
- 在正则表达式、javascript中匹配不同的url开头
- 匹配URL的Regex以子域开头,而不是“”;www”;
- 主干网是否可以创建一个与所有以某个东西开头的url匹配的路由
- 在Angularjs中,ui-router访问状态url开头的参数
- 正则表达式,查找不以="开头的URL's
- 在Javascript字符串中的url开头和结尾插入一个字符
- CQ:为什么jquery在我的web服务url的开头添加/ajax