正则表达式模式在行的开头不匹配

时间:2011-09-29 04:49:33

标签: php regex

我有这种模式:

/([^>'"])(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/

将此作为主题使用时:

http://www.google.com <a href="http://www.google.com">http://www.google.com</a> http://www.google.com

它匹配最后一个http://www.google.com但不匹配该行开头的第一个{{1}}。我怎样才能让它在线的开头与第一个相匹配? (并且在锚标记内继续不匹配)

3 个答案:

答案 0 :(得分:1)

这是因为[^'">]表示不是'">的任何一个字符。在行的开头http之前没有一个字符,这就是为什么它不匹配。

一种可能性(不一定是最好的)是使用类似的东西:

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

(两种可能的模式之一)。这基本上意味着在行的开头给我所有你当前指定以及“http”的人。

我不怀疑使用更高级的正则表达式功能,比如前瞻,负面观察或者在(a)之下的鲜为人知的暗中看法,这是很棘手的方法,但是我大多数时候都喜欢简单。


(a)在这个答案中提到的某些功能实际上可能不存在: - )

答案 1 :(得分:1)

/(^|[^>'"])(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/会为你做的。 ^内的[]会否定其他角色。您必须将^保留在正则表达式的开头和[]之外以匹配行的开头

答案 2 :(得分:-1)

尝试([^'">])?(http)(未经测试)