preg match возвращает уведомление: неопределенное смещение


Я делаю торрент 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 2

1 ответ:

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