仅当正则表达式不是以javascript中的模式开头时才匹配它
我这里有点奇怪,我基本上有一大块文本,可能包含也可能不包含图像链接 假设我有一个模式可以很好地提取图像url,但是一旦找到匹配项,它就会被替换为一个元素,该元素的链接就是src。现在的问题是,文本中可能有多个匹配项,这就是它变得棘手的地方。因为url模式现在将匹配src标记url,这基本上只会进入一个无限循环 那么,有没有一种方法可以只在regex中匹配,如果它不是以像仅当正则表达式不是以javascript中的模式开头时才匹配它,javascript,regex,Javascript,Regex,我这里有点奇怪,我基本上有一大块文本,可能包含也可能不包含图像链接 假设我有一个模式可以很好地提取图像url,但是一旦找到匹配项,它就会被替换为一个元素,该元素的链接就是src。现在的问题是,文本中可能有多个匹配项,这就是它变得棘手的地方。因为url模式现在将匹配src标记url,这基本上只会进入一个无限循环 那么,有没有一种方法可以只在regex中匹配,如果它不是以像=“|=”这样的模式开头的话?因为这样它就会匹配url,比如: 一些图像http://cdn.sstatic.net/stack
=“|=”
这样的模式开头的话?因为这样它就会匹配url,比如:
一些图像http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6
但不是
一些图像
我不确定这是否可能,但如果可能,有人能给我指出正确的方向吗?在这种情况下,替换本身是不够的,因为匹配的url也需要在其他地方使用,所以它需要像捕获一样使用
我需要说明的主要场景有:
- 一块不同文本中的多个链接
- 没有任何其他文本的单个链接
- 与其他不同文本的单一链接
(\b(https?| ftp |文件):\/\/[-A-Z0-9+&@#\/%?=~!:,.;]*(?:png | jpg | gif | bmp))
==编辑2==
每个人都明白为什么我不能使用/g命令,这是一个解释问题的答案,如果我能像我最初尝试的那样使用/g,那么事情就会简单得多
您正在寻找的是一种消极的落后外观,但Javascript不支持任何类型的落后外观,因此您必须使用回调函数来检查匹配的内容,并确保其前面没有
'
或“
,或者您可以使用以下正则表达式:
(?:^|[^"'])(\b(https?|ftp|file):\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;]*(?:png|jpeg|jpg|gif|bmp))
它有一个问题,即在成功匹配的情况下,它将捕获更多字符,即输入中(\b(https?| ftp | file)
模式之前的字符,但我认为您可以轻松处理此问题
您正在寻找的是一种消极的落后外观,但Javascript不支持任何类型的落后外观,因此您必须使用回调函数来检查匹配的内容,并确保其前面没有
'
或“
,或者您可以使用以下正则表达式:
(?:^|[^"'])(\b(https?|ftp|file):\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;]*(?:png|jpeg|jpg|gif|bmp))
它有一个问题,即在成功匹配的情况下,它将捕获更多字符,即输入中(\b(https?| ftp | file)
模式之前的字符,但我认为您可以轻松处理此问题
你难道不能看看url前面是否有空格,而不是单词边界吗?看起来很有效,不过你以后必须删除匹配的空格
(\s(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*(?:png|jpeg|jpg|gif|bmp))
编辑:该死,太慢了:)我还是把这个放在这里,因为我的正则表达式比较短;)难道你不能看看url前面是否有空格,而不是单词边界吗?看起来很有效,不过你以后必须删除匹配的空格
(\s(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*(?:png|jpeg|jpg|gif|bmp))
编辑:该死,太慢了:)我还是把这个放在这里,因为我的正则表达式比较短;)正如freefaller所说,如果不需要执行,您可以使用
/g
标志一次性查找所有匹配项
否则:您可以将
(=“|=”)?
添加到正则表达式的开头,并检查$1是否未定义。如果它未定义,那么它不是以一个=“|=”
模式开始的,正如freefaller所说,如果不需要执行,您可以使用/g
标志一次性查找所有匹配项
否则:您可以将(=“|=”)?
添加到正则表达式的开头,并检查$1是否未定义。如果它没有定义,那么它不是以=“|=”
模式开始的,在最后使用/ig
命令应该可以工作,g
用于全局替换,i
用于大小写不敏感,这是必要的,因为您只有a-Z
而不是a-zA-Z
使用以下命令将显示
更新
以防我在示例中使用同一个图像URL的示例无法说服您-它也适用于不同的URL
var测试=”http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6 http://cdn.sstatic.net/serverfault/img/sprites.png?v=7";
var re=new RegExp(/(\b(https?| ftp | file):\/\/[-A-Z0-9+&@#\/%?=~!:,.;]*(?:png | jpg | gif | bmp))/ig);
document.getElementById(“输出”).innerHTML=test.replace(re“”);
在最后使用/ig
命令应该可以工作。g
用于全局替换,i
用于大小写不敏感,这是必需的,因为您只得到了A-Z
而不是A-zA-Z
使用以下命令将显示
更新
以防我在示例中使用同一个图像URL的示例无法说服您-它也适用于不同的URL
var测试=”http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6 http://cdn.sstatic.net/serverfault/img/sprites.png?v=7";
var re=new RegExp(/(\b(https?| ftp | file):\/\/[-A-Z0-9+&@#\/%?=~!:,.;]*(?:png | jpg | gif | bmp))/ig);
document.getElementById(“输出”).innerHTML=test.replace(re“”);
您是否尝试过使用/g
命令,该命令应执行一次全局替换,而不必在“未找到匹配项”之前循环执行“?在javascript中,它似乎不起作用,多个捕获和执行存在一些问题,因此需要循环,直到没有匹配项为止。”。我读到一些关于JS不支持在一个结果中捕获或多个匹配的内容,尽管您可以在JSFIDLE或s中证明上述内容
var test="http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6 http://cdn.sstatic.net/serverfault/img/sprites.png?v=7";
var re = new RegExp(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*(?:png|jpeg|jpg|gif|bmp))/ig);
document.getElementById("output").innerHTML = test.replace(re,"<img src=\"$1\"/>");