Настройка
Это делать конкретно с Карты Твиттера, но я ищу более общее (т.е. не специфическое для карт Твиттера) решение, так как многие метатеги имеют пространство имен.
Щебетать карты хранятся в голове веб-страницы, внутри meta
теги. Что-то вроде…
<meta name="twitter:site" content="... tag content ...">
Когда ты бежишь get_meta_tags()
на сайте, который использует карты, вы получите возврат, который выглядит примерно так …
[
... bunch of other meta tags ...
"twitter:card" : "... tag content ...",
"twitter:description" : "... tag content ...",
"twitter:title" : "... tag content ...",
"twitter:site" : "... tag content ...",
"twitter:image" : "... tag content ...",
"twitter:creator" : "... tag content ...",
... maybe some more tags ...
]
Все ключи, которые имеют отношение к Карте Twitter, Namespaced — Я имею в виду, что каждый из них предваряется twitter:
,
Даже если на странице присутствуют теги Twitter-карты, не все перечисленные выше теги обязательно будут там. Иногда они все, иногда пара.
Эта проблема
Давайте дадим нам несколько метатегов …
$tagsList = @get_meta_tags($url);
Потому что ты не знаешь наверняка какие теги будут присутствовать, нет смысла проверять их все …
if(isset($tagsList['twitter:card'])) {
// Do something
}
if(isset($tagsList['twitter:description'])) {
// Do something
}
... and so on ...
Этот подход также особенно неэффективен, если вы не знаете, каждый возможное имя тега, которое может присутствовать, или Twitter решает изменить текущий стандарт.
Таким образом, вместо этого вы перебираете все теги …
$twitterList = array();
foreach($tagsList as $tagName => $tagCont) {
if(strpos(strtolower($tagName), 'twitter:') === 0) {
// root = 'twitter', sub = 'card' or 'description' or ...
list($root, $sub) = explode(':', $tagName);
$twitterList[] = array(
'root' => $root, // Don't really need this
'sub' => $sub,
'content' => $tagCont
);
}
}
И это работает удовольствие. Это точно, и возвращает ваши метки Twitter Card в хороший список. Но, если мне нужны только теги, относящиеся к твиттер-карте, какого черта я должен заниматься циклом через ВСЕ из них !?
Вопрос
Существует ли быстрый способ доступа к этим ключам пространства имен без циклического прохождения каждого метатега, возвращенного со страницы? Меня интересует только twitter:
так что я не хочу тратить ресурсы и время на просмотр каждого тега.
Что-то вроде…
$twitterTags = $tagsList['twitter:'];
где вывод будет по линии …
$twitterTags : [
'card' : 'card content',
'description' : 'desc content',
... and so on ...
]
Я считаю, что вы могли бы использовать array_map()
, который может быть сократить количество используемых строк кода, но вы все равно будете в конечном итоге перебирать все ключи.
Хорошо, я знаю, что это не обязательно, но …
Если на странице нет необоснованного количества метатегов (их несколько миллиардов), разница во времени и ресурсах между циклом перебора и более элегантным решением будет незначительной. Но это все еще интересное упражнение.
Правка № 1
Благодаря Даниэль Кляйн, Я нашел эту красоту …
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
Который используется следующим образом …
$pattern = '/(twitter\:)([\w\d\-\_]+)/';
$twitterList = preg_grep_keys($pattern, $tagsList, $flags = 0);
И возвращается …
"twitterList": {
"twitter:card": "... tag content ...",
"twitter:description": "... tag content ...",
"twitter:title": "... tag content ...",
"twitter:site": "... tag content ...",
"twitter:image": "... tag content ...",
"twitter:creator": "... tag content ..."}
Какая жемчужина! Но я не уверен, как array_intersect_key()
а также array_flip()
заниматься своими делами Я, вероятно, все еще перебираю массив. И конечно array_keys()
должен зациклить массив?
Это выглядит красивее, чем foreach()
выше, во всяком случае.
Нет, такой функциональности нет, так как get_meta_tags () не предназначена для этого (и, конечно, была разработана до того, как Twitter представил свой собственный набор мета-тегов).
Вам нужно будет либо выполнить итерацию по списку, как вы делаете (или использовать array_map (), как вы также упомянули о себе), либо загрузить html, используя DomDocument, и переместить / найти (с помощью xpath) структуру DOM, чтобы найти метатеги, которыми вы являетесь находясь в поиске.
На самом деле, twitter:description
схема именования — это просто схема именования, выбранная Twitter. Это не фактическое пространство имен и теги не являются частью какого-либо стандарта. Если вы хотите, чтобы php поддерживал эту функцию get_meta_tags, вы можете попробовать предложить его как функцию, чтобы добавить
Других решений пока нет …