Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当正则表达式不是以javascript中的模式开头时才匹配它_Javascript_Regex - Fatal编程技术网

仅当正则表达式不是以javascript中的模式开头时才匹配它

仅当正则表达式不是以javascript中的模式开头时才匹配它,javascript,regex,Javascript,Regex,我这里有点奇怪,我基本上有一大块文本,可能包含也可能不包含图像链接 假设我有一个模式可以很好地提取图像url,但是一旦找到匹配项,它就会被替换为一个元素,该元素的链接就是src。现在的问题是,文本中可能有多个匹配项,这就是它变得棘手的地方。因为url模式现在将匹配src标记url,这基本上只会进入一个无限循环 那么,有没有一种方法可以只在regex中匹配,如果它不是以像=“|=”这样的模式开头的话?因为这样它就会匹配url,比如: 一些图像http://cdn.sstatic.net/stack

我这里有点奇怪,我基本上有一大块文本,可能包含也可能不包含图像链接

假设我有一个模式可以很好地提取图像url,但是一旦找到匹配项,它就会被替换为一个元素,该元素的链接就是src。现在的问题是,文本中可能有多个匹配项,这就是它变得棘手的地方。因为url模式现在将匹配src标记url,这基本上只会进入一个无限循环

那么,有没有一种方法可以只在regex中匹配,如果它不是以像
=“|=”
这样的模式开头的话?因为这样它就会匹配url,比如:

一些图像http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6

但不是

一些图像

我不确定这是否可能,但如果可能,有人能给我指出正确的方向吗?在这种情况下,替换本身是不够的,因为匹配的url也需要在其他地方使用,所以它需要像捕获一样使用

我需要说明的主要场景有:

  • 一块不同文本中的多个链接
  • 没有任何其他文本的单个链接
  • 与其他不同文本的单一链接
==编辑==

以下是我用于匹配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\"/>");