【问题标题】:regexp - find all matches of links [duplicate]正则表达式 - 查找链接的所有匹配项[重复]
【发布时间】:2013-01-19 20:26:42
【问题描述】:

可能重复:
PHP URL to Link with Regex

我正在尝试preg_replace文本块中的所有链接,以便将它们替换为字符串"<< IMAGE >>"

我正在尝试匹配此文本块中的所有链接:

"Here we can see the chupacabra trying to eat http://somesite.com/img/chupacabra.jpg. 
look at the the snails somesite.com/img/snails.png"

我正在使用这个正则表达式:

(https?:\/\/)?.*(jpg|png|jpeg|bmp|gif)

但我无法让它只选择确切的链接字符串。
我需要的是这个:

“在这里我们可以看到卓柏卡布拉试图吃东西 http://somesite.com/img/chupacabra.jpg看蜗牛 somesite.com/img/snails.png"

测试regexpal.com

【问题讨论】:

  • 这不是一个新的“问题”。请先搜索。

标签: php regex


【解决方案1】:

有两个问题 - 首先 * ist 贪婪,所以它匹配的方式很多。第二个是,.* 包含空格,这些空格不在 URL 中,因此您不会得到正确的 URL。

最简单的解决方案是使用 \S 匹配除空格以外的所有内容:

(https?:\/\/)?\S*(jpg|png|jpeg|bmp|gif)

更好的方法是使用这个使用 ?

(?<= |^)(https?://)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(/\S*)\.(jpg|png|jpeg|bmp|gif)

【讨论】:

  • 我怎样才能让它不匹配 tttteerehttp://site.com/1.jpg ?
  • 在开头添加一个\b 以将其标记为单词边界
  • @Phillip 在 regexpal.com 上进行测试,虽然听起来很合乎逻辑,但在那儿行不通
  • 好的,我明白了.. 这是因为 \S 在他开始时会处理无效的废话.. 尝试\b(https?:\/\/)?[^ :]*(jpg|png|jpeg|bmp|gif)
  • 它不会匹配 dfdfdfdfhttp://www.google.com/1.jpg 只是 http:// 之后的部分
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多