preg_match возвращает уведомление: неопределенное смещение - PullRequest
2 голосов
/ 11 февраля 2012

Я делаю 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 Ответ

5 голосов
/ 11 февраля 2012

Вы предполагаете, что 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

EDIT

Похоже, что соответствие вашей категории проверяет строку utf-8, поэтому попробуйте использовать ключ / u

...