регулярное выражение для извлечения всех атрибутов из всех мета-тегов - PullRequest
1 голос
/ 17 июля 2011

Я пытаюсь извлечь мета-теги из html-страницы, чтобы сравнить две страницы (live и dev), чтобы убедиться, что их SEO одинаковы после редизайна / реорганизации сайта.Мне нужно сравнить заголовок, мета-теги (описание, opengraph и т. Д.), H1, нашу аналитику (Omniture) и наши рекламные теги (двойной клик), которые одинаковы.

Моя проблема с получением мета-тегов http://php.net/manual/en/function.get-meta-tags.php работает, только если у них есть атрибут name =, то же самое с решением "mariano at cricava dot com".

Я не знаюЕсли я не хочу ограничивать его наличием определенных атрибутов, я могу предположить, что все наши метатеги имеют либо имя =, либо свойство =, либо http-эквивалент =, и соответствующим образом изменить регулярное выражение, но не могу быть полностью уверен, поскольку это массивный веб-сайт ив тегах может быть любое случайное дерьмо (следовательно, этот инструмент предназначен для проверки этого материала!), и я хотел бы оставить его как можно более динамичным.

У меня есть

$page = @file_get_contents('http://.../');
preg_match_all('#<meta(?:\s+?([^\=]+)\=\"(.+?)\")+?\s*?/?>#sui', $page, $matches, PREG_SET_ORDER)

, но подшаблоныперекрывают друг друга, так что это только вытаскивает последнюю пару атрибут-имя = атрибут-значение

Array
(
    [0] => Array
        (
            [0] => <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            [1] => content
            [2] => text/html; charset=UTF-8
        )

    [1] => Array
        (
            [0] => <meta name="description" content="some description" />
            [1] => content
            [2] => some description
        )

    [2] => Array
        (
            [0] => <meta property="og:type" content="website" />
            [1] => content
            [2] => website
        )
...

Мне нужны все атрибуты для всех метатегов.Я мог бы сделать это в два шага, вытащив содержимое <meta ([^>]*)>, затем выполнив второе регулярное выражение для результатов, но это кажется ненужным с силой регулярного выражения?

Ответы [ 3 ]

1 голос
/ 17 июля 2011

Но вернемся к исходному вопросу, забудь, что это HTML, пока нет способа вернуть повторяющиеся подшаблоны в preg_match_all чем просто вернуть последний матч?

Невозможно с preg_* / PCRE (ни с каким другим знакомым мне регулярным выражением, но в Perl вы можете использовать (?{ push @list, $^N }) хак).

0 голосов
/ 23 июля 2015

Я делаю это так. Сначала вытащите метатеги со следующим регулярным выражением

string regex = "<meta\\s(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\">])+>";

Я нашел здесь регулярное выражение -

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Затем вытащите атрибуты, используя другое регулярное выражение, которое было бы довольно просто написать.

0 голосов
/ 20 марта 2012
 preg_match_all("<meta\\s*(?:(?:\\b(\\w|-)+\\b\\s*(?:=\\s*(?:[\"\"[^\"\"]*\"\"|'[^']*'|
   [^\"\"'<> ]|[''[^'']*''|\"[^\"]*\"|[^''\"<> ]]]+)\\s*)?)*)/?\\s*>", $content, $meta);        

попробуйте с этим

...