preg_match возвращает пустую строку, даже если есть совпадение
Я пытаюсь извлечь все метатеги на веб-странице, в настоящее время я использую preg_match_all, чтобы получить это, но, к сожалению, он возвращает пустые строки для индексов массива.
<?php
$meta_tag_pattern = '/<meta(?:"[^"]*"[\'"]*|\'[^\']*\'[\'"]*|[^\'">])+>/';
$meta_url = file_get_contents('test.html');
if(preg_match_all($meta_tag_pattern, $meta_url, $matches) == 1)
echo "there is a match <br>";
print_r($matches);
?>
Возвращаемый массив:
Array ( [0] => Array ( [0] => [1] => [2] => [3] => ) ) Array ( [0] => Array ( [0] => [1] => [2] => [3] => ) )
2 ответа
Решение
ОБНОВЛЕНО: Пример получения метатегов с URL:
$meta_tag_pattern = '/<meta\s[^>]+>/';
$meta_url = file_get_contents('http://stackru.com/questions/10551116/html-php-escape-and-symbols-while-echoing');
if(preg_match_all($meta_tag_pattern, $meta_url, $matches))
echo "there is a match <br>";
foreach ( $matches[0] as $value ) {
print htmlentities($value) . '<br>';
}
Выходы:
there is a match
<meta name="twitter:card" content="summary">
<meta name="twitter:domain" content="stackru.com"/>
<meta name="og:type" content="website" />
...
Похоже, что часть проблемы заключается в том, что браузер отображает метатеги как метатеги и не отображает текст при выводе print_r, поэтому их необходимо экранировать.
Пример с DOMDocument:
$url = 'test.html';
$dom = new DOMDocument();
@$dom->loadHTMLFile($url);
$metas = $dom->getElementsByTagName('meta');
foreach ($metas as $meta) {
echo htmlspecialchars($dom->saveHTML($meta));
}