如何在preg_match()函数中将变量与其他模式一起用作模式?

时间:2016-08-13 07:25:07

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

实际上我正在为我的迷你项目编写一个网络爬虫。 我只想抓取属于输入网站的那些网页。我希望我的网络抓取工具不要抓取到目前提供的输入以外的其他网站。

这就是我正在做的事情: $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); 任何其他建议都会有所帮助,在此先感谢。

3 个答案:

答案 0 :(得分:0)

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

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

修改

可能最好用preg_quote

来逃避$ url

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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