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));
}
Другие вопросы по тегам