Я пытаюсь использовать код из Пользователь добавил заметки на 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);
Но опять же, я довольно ужасен с регулярным выражением. Есть идеи?
Идея состоит в том, чтобы захватить мета-имя / свойство внутри смотреть вперед за то, что не зависит от последовательности:
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>
используя предоставленное регулярное выражение или попробуй с парсером.
Других решений пока нет …