正则表达式与PHP中的内容不匹配


Regular Expression not matching content in PHP

我正在尝试抓取一个ebay页面,如以下页面:http://www.ebay.co.uk/sch/Cars-/9801/i.html?_nkw=vw+高尔夫

一切都很好,除了我的一个正则表达式与内容不匹配,因此匹配项不会被推送到$linksArray。我已经输出了内容,以确保我试图匹配的内容在那里是有效的——事实确实如此。然后我转到print_r($linksArray),所有匹配项都应该在那里。但事实并非如此。它是一个空的多维数组。你可以在这里看到我的示例:http://www.mycommunity.co.za/marcksack/index.php

这是我的PHP代码:

<?php
echo '<form method="POST">
<input type="text" id="url" name="url" size="120" value="' . (isset($_REQUEST["url"]) && !empty($_REQUEST["url"]) ? $_REQUEST["url"] : "") . '"/>
<input type="submit" value="Submit" />
</form>';
flush();
if (isset($_REQUEST["url"]) && !empty($_REQUEST["url"])) {
    $url = $_REQUEST["url"];
    $phones = array();
    for ($page = 1; $page <= 1; $page++) {
        // get page contents
        $contents = file_get_contents($url . "&_pgn=" . $page);
        echo(htmlentities($contents));
        // find all links patterns
        // HERE IS THE PROBLEM
        $pattern = '/class="lvtitle"><a href="(.*)" class="vip"/';
        $linksArray = array();
        preg_match_all($pattern, $contents, $linksArray);
        print_r($linksArray);
        $links = $linksArray[0];
        foreach($links as $link) {
            $pureLink = str_replace("class='"lvtitle'"><a href='"", "", $link);
            $pureLink = str_replace("'" class='"vip'"", "", $pureLink);
            // getting sub page contents
            $subContents = file_get_contents($pureLink);
            // find all links patterns
            $subContents = str_replace(" ", "", $subContents);
            $phonePattern = '/07[0-9]{9}/';
            $phonesArray = array();
            preg_match_all($phonePattern, $subContents, $phonesArray);
            foreach($phonesArray[0] as $element) {
                // check if phone not added previousely to the phones array
                if (!in_array($element, $phones)) {
                    // add it to the phones array
                    array_push($phones, $element);
                    echo $element . "<br />";
                    flush();
                }
            }
        }
    }
    // print results
    foreach($phones as $phone){
        echo $phone."<br/>";
    }
}
?>

很明显,我的问题是我做错了什么?为什么没有将匹配项推送到我的$linksArray变量。我真的很感谢你的帮助!

此正则表达式有效:

"/ class='"lvtitle'"><a href='"([^'"]*)'"  class='"vip'"/"

你的一些问题:

  1. 您试图使用(.*)捕获URL,该URL将与整行匹配
  2. 它与整行不匹配,因为ebay在class和href属性之间有两个空格

此外,正如已经提到的,您应该使用API或DOMDocument来实现这一点。但如果你好奇,这就是为什么它不起作用。我希望这能有所帮助!