【问题标题】:PHP Regex: match text urls until space or end of stringPHP Regex:匹配文本网址,直到空格或字符串结尾
【发布时间】:2012-06-17 18:18:12
【问题描述】:

这是文本示例:

$text = "asd dasjfd fdsfsd http://11111.com/asdasd/?s=423%423%2F gfsdf http://22222.com/asdasd/?s=423%423%2F
asdfggasd http://3333333.com/asdasd/?s=423%423%2F";

这是我的正则表达式模式:

preg_match_all( "#http:\/\/(.*?)[\s|\n]#is", $text, $m );

匹配前两个 url,但我如何匹配最后一个?我尝试添加 [\s|\n|$] 但这也只会匹配前两个网址。

【问题讨论】:

  • 没用。不管它是什么意思。我很确定这种模式总是有效的。
  • @hakre 它与第三个网址不匹配,只有前两个。
  • | 用于() 而不是[] 表示。您是否尝试过:(\s|\n|$)(?:\s|\n|$)? (?: 使组不匹配)-另外,您可以在 $text 中添加一个空格;)
  • @hakre (\s|\n|$) 谢谢。

标签: php regex parsing preg-match preg-match-all


【解决方案1】:

不要尝试匹配\n(毕竟没有换行符!),而是使用$(它将匹配到字符串的末尾)。

编辑: 我很想听听为什么我最初的想法行不通,所以如果你知道,请告诉我。我猜是因为[] 试图匹配一个字符,而行尾不是一个? :)

这个可以用:

preg_match_all('#http://(\S+)#is', $text, $m);

请注意,您不必转义 /,因为它们不是分隔符,但您必须在使用双引号时转义 \(因此解析字符串)。相反,我为此使用了单引号。

【讨论】:

  • "#http:\/\/(.*?)[\s|\n|$]#is" 与我的第三个网址不匹配。
  • 很有趣,现在也试试。它确实不匹配(同样;如上所述;| 已过时(并被解释为 [] 中的另一个可能值)。
  • 在方括号内,$ 匹配文字 $,就像 | 匹配文字 |。正如@dsrekab 建议的那样,您需要寻找(\s|$)\n 是多余的,因为这是\s 匹配的字符之一)。但我认为你现在的做法更好。
【解决方案2】:

我不熟悉 PHP,所以我没有确切的语法,但也许这会给你一些尝试。 [] 表示一个字符类,因此 |$ 将按字面意思查找 $。我认为您需要的是另一种展望,如下所示:

#http:\/\/(.*)(?=(\s|$))

如果这太离谱了,我深表歉意,但也许它会给你另一个尝试的角度。

【讨论】:

    【解决方案3】:

    What is the best regular expression to check if a string is a valid URL?

    它有一些很长的正则表达式,可以匹配所有的 url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2014-09-21
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多