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