regex — модифицированный PHP get_meta_tags не работает для некоторых URL

Я пытаюсь использовать код из Пользователь добавил заметки на php.net для get_meta_tags функция. Из того, что кажется, если метатег отформатирован <meta content="foo" name="bar" /> тогда код пропустит это. В настоящее время только теги отформатированы как <meta name="bar" content="foo"/> буду работать. Я не очень хорошо разбираюсь в regex и безуспешно пытался это исправить. Вот пример URL это, кажется, ускользает через регулярное выражение. Заранее извиняюсь, что мой вопрос не обязательно о get_meta_tags функции, но кажется, что это может быть связано с некоторыми другими проблемами, которые люди имели с этой функцией.

Кажется, что проблема где-то здесь:

preg_match_all('/<[\s]*meta[\s]*(name|property)="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

который может быть что-то вроде:

preg_match_all('/<[\s]*meta[\s]*(name|property|content)="?' . '([^>"]*)"?[\s]*' . '(content|name)="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

Но опять же, я довольно ужасен с регулярным выражением. Есть идеи?

3

Решение

Идея состоит в том, чтобы захватить мета-имя / свойство внутри смотреть вперед за то, что не зависит от последовательности:

function extract_meta_tags($source)
{
$pattern = '
~<\s*meta\s

# using lookahead to capture type to $1
(?=[^>]*?
\b(?:name|property|itemprop|http-equiv)\s*=\s*
(?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
)

# capture content to $2
[^>]*?\bcontent\s*=\s*
(?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
[^>]*>

~ix';

if(preg_match_all($pattern, $source, $out))
return array_combine(array_map('strtolower', $out[1]), $out[2]);
return array();
}

Увидеть тест на regex101. Использовал сброс ветки функция для извлечения значений различных стилей кавычек.

print_r(extract_meta_tags($str)); Попробуйте с другими данными на eval.in


Используйте это на HTML <head> раздел. Чтобы получить исходный код страницы и извлечь заголовок:

1.) Получить источник с помощью завивать, file_get_contents или же fsockopen.

2.) Извлечение <head> используя дом или регулярное выражение как это: (?is)<head\b[^>]*>(.*?)</head>

3.) Извлечение мета-тегов из <head> используя предоставленное регулярное выражение или попробуй с парсером.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]