Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: парс XML тегов
Форумы портала PHP.SU » PHP » Регулярные выражения » парс XML тегов

Страниц (1): [1]
 

1. DelphinPRO - 06 Марта, 2013 - 17:50:43 - перейти к сообщению
есть такая строка
CODE (html):
скопировать код в буфер обмена
  1. <tag name="spinner" value="val"/>

нужно вытащить оттуда все пары атрибут-значение
количество атрибутов - произвольное,
названия атрибутов - произвольные

пишу такую регу
CODE (text):
скопировать код в буфер обмена
  1. !<tag(\s+[a-z]+="[a-z]+")*\s*/>!Uusi

получаю только последний атрибут
CODE (text):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [0] => <tag name="spinner" value="val"/>
  4.     [1] =>  value="val"
  5.     [2] => value
  6.     [3] => val
  7. )


код
PHP:
скопировать код в буфер обмена
  1. $html = '<tag name="spinner" value="val"/>';
  2. echo preg_match('!<tag(\s+([a-z]+)="([a-z]+)")*\s*/>!Uusi', $html, $matches);
  3. print_r($matches);
2. Мелкий - 06 Марта, 2013 - 18:05:42 - перейти к сообщению
XML? Тогда с какой радости регуляркой?
3. DelphinPRO - 06 Марта, 2013 - 18:08:08 - перейти к сообщению
там входной поток символов не является валидным XML. Можно считать - просто поток рандомных символов, среди которых нужно выцепить xml теги, а точнее атрибуты этих тегов.
(Добавление)
пока вижу решение с двойным проходом. сначала выцепляю все теги

потом из полученного вытаскиваю атрибуты
CODE (text):
скопировать код в буфер обмена
  1. !([a-z]+)="([a-z]+)"!Usi
4. DlTA - 06 Марта, 2013 - 18:59:31 - перейти к сообщению
делайте в 2 захода
PHP:
скопировать код в буфер обмена
  1. preg_match('/<tag((?:\s+[a-z]+="[a-z]+")*)\s*\/>/',$text,$matches1);
  2. preg_match_all('/(?:\s+([a-z]+="[a-z]+"))/', $matches1[1], $matches2);
  3. var_dump($matches2);

 

Powered by ExBB FM 1.0 RC1