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