Предлагаю код очень простой функции-парсера атрибутов из кусочков html кода. Основное назначение — разбирать текст short-codes.
На входе: html код или shortcode.
На выходе: имя тега и набор атрибутов. Если ничего подходящего не найдено — получим false.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function tagParse($code) { if (preg_match_all('/([a-z:_]+)(=\"([^"]*)\")?/ism', $code, $m)) { $parts = array('tag' => '', 'attr' => array()); foreach ($m[1] as $i => $v) { if (!$i) $parts['tag'] = mb_strtoupper($v); else $parts['attr'][mb_strtoupper($v)] = $m[3][$i]; } return $parts; } return false; } |
Примеры парсинга
Безразличие к виду скобок
Под шаблон одинаково хорошо подойдут входные данные вроде:
1 2 3 |
[a href="http://www.yandex.ru" rel="nofollow"] <a href="http://www.yandex.ru" rel="nofollow"> {a href="http://www.yandex.ru" rel="nofollow"} |
Результатом в любом из случаев будет вот такой массив:
1 2 3 4 5 6 7 |
Array ( [tag] => A [attr] => Array ( [HREF] => http://www.yandex.ru [REL] => nofollow ) ) |
Имена атрибутов и тега переводятся в верхний регистр. Может работать и вообще без скобок.
Несколько тегов
Если в парсер сунуть что то вроде :
1 2 3 |
<meta name="twitter:card" content="summary"> <meta name="twitter:domain" content="stackoverflow.com"/> <meta property="og:type" content="website" /> |
т.е. пачку тегов вместо одного, то получим вот такой массив:
1 2 3 4 5 6 7 8 9 |
Array ( [tag] => META [attr] => Array ( [NAME] => twitter:domain [CONTENT] => website [META] => [PROPERTY] => og:type ) ) |
Функция проглотит последующие теги в качестве атрибутов, а одноименные атрибуты будут переписаны.