【问题标题】:Regular expression starting with http and ending with pdf?以http开头并以pdf结尾的正则表达式?
【发布时间】:2011-09-10 00:25:22
【问题描述】:

我已经加载了一个页面的整个 HTML,并且想要检索所有以 http 开头并以 pdf 结尾的 URL。我写了以下不起作用:

$html = file_get_contents( "http://www.example.com" );
preg_match( '/^http(pdf)$/', $html, $matches );

我对正则表达式很陌生,但从我学到的知识来看,^ 标志着模式的开始,$ 标志着模式的结束。我做错了什么?

【问题讨论】:

  • 不要用正则表达式解析 HTML。
  • @hakre 他似乎在寻找任何链接,可能是纯文本链接,所以他不想解析 HTML。
  • @Matthieu:在代码示例中,第一行读取完整的 HTML 源代码,第二行运行正则表达式。这不是说他想用正则表达式解析 HTML 吗?你怎么称呼它?
  • @hakre:您将如何搜索常规文本中的 URL?你对 do-not-parse-html-with-regex-thing 是正确的,但是文本节点也可以包含 URL。您无法使用常规解析器提取这些信息。他的做法是完全合理的。
  • @elusive:我不知道 file_get_contents() 只能从 HTML 文档中提取文本节点。

标签: php regex preg-match


【解决方案1】:

试试这个:

preg_match_all('/\bhttp\S*?pdf\b/', $html, $matches);

请注意,您需要在此处使用preg_match_all()-function,因为您尝试匹配多个匹配项。 ^$ 不起作用,因为它们仅适用于行或文件边界(取决于使用的修饰符)。

【讨论】:

  • 我不知道为什么这被否决了,但我很想听听原因;)
【解决方案2】:

试试这个,

preg_match( '/\bhttp\S*pdf\b/', $html, $matches );

你需要匹配httppdf之间的部分,这就是.*?正在做的事情。

^ 匹配字符串的开头,$ 匹配结尾,但是当您想从较长的文本中提取这些链接时,这不是您想要的。

\b 匹配单词边界

更新

为了完整性,.*? 仍然会匹配太多,因此与 \S* 交换

\S 匹配非空白字符

【讨论】:

  • 为什么是*??那不是一个接一个的2个量词吗?
  • @gnur ? 使 * 不贪婪,否则 .* 将匹配到字符串中的最后一个 pdf
【解决方案3】:

preg_match( '/http[^\s]+pdf/', $html, $matches );

匹配 http 后跟非 ([^...]) 空格 (\s) 一次或多次 (+) 后跟 pdf

【讨论】:

  • 我认为我的答案不值得投反对票,我看不出有任何理由。
【解决方案4】:

需要匹配网址中间的字符:

/\bhttp[\w%+\/-]+?pdf\b/
  • \b 匹配单词边界

  • ^$ 标记整个字符串的开始和结束。你不希望他们在这里。

  • [...] 匹配括号中的任何字符

  • \w 匹配任何单词字符

  • + 匹配上一个或多个匹配项

  • ? 使+ 变得懒惰而不是贪婪

【讨论】:

【解决方案5】:

preg_match( '/^http.*pdf$/', $html, $matches );

更好(工作)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多