0

在下面的代码中,它应该扫描链接并将它们索引到数组 [links] 中。但由于某种原因,他们不会索引。

我开始思考如果我的正则表达式代码是错误的,我该如何改进它。这也是我的 file_get_contents 命令吗?是否正确使用?

$links = Array();

$URL = 'http://www.theqlick.com'; // change it for urls to grab  

// grabs the urls from URL 
$file  = file_get_contents($URL);

    $abs_url = preg_match_all("'^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$^'", $file, $link);
    if (!empty($abs_url)) {
        $links[] = $abs_url;
    }
4

3 回答 3

0

preg_match_all 返回完整模式匹配的数量(可能为零),如果发生错误,则返回 FALSE (c) php.net

preg_match_all("'^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$^'", $file, $matches);

if (!empty($matches)
  $links = $matches;
于 2012-09-20T17:19:47.103 回答
0

你的正则表达式是错误的。^您在与尾部匹配相邻的模式末尾有一个头锚$。我不认为锚真的不需要。此外,您将匹配项存储在$link(no s) 中的变量。加上您的模式分隔符似乎是'字符。那是故意的吗?幸运的是,它会起作用,但我猜你不是故意的?

尝试这个:

$matchCount = preg_match_all("/(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?/", $file, $matches);
if ($matchCount)
{
    foreach ($matches as $match)
    {
        $links[] = $match[0];
    }
}

阅读PHP 正则表达式

于 2012-09-20T17:22:44.273 回答
0

在您的 preg_match_all 中,您将保存到 $link 而不是 $links。

于 2012-09-20T17:16:37.230 回答