【问题标题】:How to use a variable as a pattern along with the other patterns in preg_match() function?如何将变量与 preg_match() 函数中的其他模式一起用作模式?
【发布时间】:2016-12-20 04:44:00
【问题描述】:

实际上,我正在为我的迷你项目编写一个网络爬虫。 我只想抓取那些只属于输入网站的网页。我希望我的网络爬虫不会爬到除了现在给出的输入之外的其他网站。

这就是我正在做的事情: $url = $_POST["url"]; $web = @file_get_contents($url); preg_match_all("/<a\s.*href=\"(.*)\"/U", $web, $matches); 我想做的是: $url = $_POST["url"]; $web = @file_get_contents($url); preg_match_all("/<a\s.*href=\"(.*$url.*)\"/U", $web, $matches); 例如: 输入:https://www.google.com/ 那么正则表达式应该是: preg_match("/.*google.com.*/U", xyz, xyz); 任何其他建议都会有所帮助,在此先感谢。

【问题讨论】:

  • 欢迎来到stackoverflow 火影忍者君。提出一个明确的问题会更容易帮助你。请阅读这篇文章以确保您得到一个好的答案stackoverflow.com/help/how-to-ask

标签: php regex web-crawler preg-match preg-match-all


【解决方案1】:

将分隔符更改为不在任何 URL 中的内容?

preg_match_all("#<a\s.*href=\"(.*$url.*)\"#U", $web, $matches);

编辑

使用preg_quote 转义$url 可能更好

【讨论】:

  • 在 URL 中可以找到英镑符号,但无论如何这可能会有所帮助。
【解决方案2】:

我找到了解决方案,这就是解决方案。 如果您想将变量与正则表达式一起使用。

preg_match("/regular_expression".($my_variable)."regular_expression/U", $source, $matches);

【讨论】:

  • 如果您的$my_variable 中有/ 怎么办?
  • 在我的情况下,基本上 $my_variable 是一个网页的名称,因此变量中不可能有“/”。如果你想包含一个“/”,那么在“/”之前放一个“\”。例如:如果我想为链接写一个正则表达式,那么我会写 .. preg_match( "/https:\/\/.*\.com/U", xyz, xyz);
  • 如果你使用一个变量,你需要preg_quote它。使用附加字符作为您的正则表达式分隔符。
【解决方案3】:

真正的解决方案是使用带有实际正则表达式分隔符的preg_quote,并使用点语法将该部分附加到正则表达式文字部分:

preg_match_all("/<a\s.*href=\"(.*" . preg_quote($url, "/") . ".*)\"/U", $web, $matches);
                                   ^ ^^^^^^^^^^       ^^^  ^

点就像在其他一些语言中用于字符串连接的+preg_quote 将确保变量字符串中的所有特殊正则表达式元字符都被正确转义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2018-05-22
    • 2019-01-06
    相关资源
    最近更新 更多