preg_match返回通知:未定义的偏移量

时间:2012-02-11 18:18:00

标签: php curl preg-match web-crawler

我正在制作Torrent PHP Crawler,我遇到了问题,这是我的代码:

// ... the cURL codes (they're working) ...
// Contents of the Page
$contents = curl_exec($crawler->curl);

// Find the Title
$pattern = "/<title>(.*?)<\/title>/s";
preg_match($pattern, $contents, $titlematches);
echo "Title - ".$titlematches[1]."<br/>";

// Find the Category
$pattern = "/Тип<\/td><td(?>[^>]+)>((?>[^<]+))<\/td>/s";
preg_match($pattern, $contents, $categorymatches);
echo "Category - ".$categorymatches[1]."<br/>";

HTML页面(“Тип”表示类别,“Филми”表示电影):

<title>The Matrix</title>
<!--Some Codes Here--!>
<tr><td>Тип</td><td valign="top" align=left>Филми</td></tr>
<!--Some Codes Here--!>

结果:

Title - The Matrix
Notice: Undefined offset: 1 in /var/www/spider.php on line 117

它显示标题但不显示类别..为什么? 我试图回复$categorymatches[0]$categorymatches[2]$categorymatches[3]而没有任何运气。

1 个答案:

答案 0 :(得分:5)

您假设preg_match实际上找到了匹配项。最好测试它是否这样做。

$pattern = "/<title>(.*?)<\/title>/s"; 
$matchCount = preg_match($pattern, $contents, $titlematches); 
if ($matchCount > 0) {
    echo $titlematches[1]."<br/>";
} else {
    // do something else, 'cos no match found
}

请注意,您可能希望在preg_match中使用一个或两个开关:这只会在使用“title”时找到结果,而不是“TITLE”或“Title”,因此使用不区分大小写的/ i开关可能是一个主意;或者标签可能在与该值不同的一行上,以及该多行开关/ m可能有用。

同样的原则适用于所有preg_match检查

修改

看起来您的类别匹配正在测试utf-8字符串,因此请尝试使用/ u开关