2010-10-29 2 views
0

P/S: Я программист PHP. Дано:Подготовить строку с регулярным выражением для управления тегами HTML

div{3|5|6|9}[id = abc| class=image], a[id=link|class=out] 

Я хочу использовать регулярное выражение для получения результата в виде массива, например:

массив (

[div] => array(
       "3|5|6|9", 
       "id = abc| class=image" 
       ) 

    [a] => array(
       "", 
       "id=link|class=out") 

)

ли кто-нибудь, пожалуйста, помогите? Большое вам спасибо!

+0

Должно ли это быть регулярным выражением? Я просто обработаю символ последовательности строк символом и создаю результат, когда я шел ... –

ответ

1

У попробовать с этим:

$str='div{3|5|6|9}[id = abc| class=image], a[id=link|class=out]'; 

preg_match_all('/(\w+)(\{(.*?)\})?\[(.*?)\](?:, |$)?/', $str, $m); 

$out = array($m[1][0] => array($m[3][0], $m[4][0]), $m[1][1] => array($m[3][1], $m[4][1])); 

print_r($out); 

Выход:

Array 
(
    [div] => Array 
     (
      [0] => 3|5|6|9 
      [1] => id = abc| class=image 
     ) 

    [a] => Array 
     (
      [0] => 
      [1] => id=link|class=out 
     ) 

) 
0

Если вы можете гарантировать, что запятая не будет существовать между { и } и между [ и ], вы можете сначала разбить строку на ,, а затем использовать это регулярное выражение:

/([a-z]+)(\{(.*?)\})?\[(.*?)\]/ 

Захваченные группы, которые вы хотите это $1, $3 и $4 (эта обратная ссылка должна совпадать, если вы используете preg_match_all)

Примечание: Я проверил это в Javascript.

0
preg_match_all('/(\w+)(\{(.*?)\})?\[(.*?)\](?:, |$)?/', $str, $m); 

Я считаю, что выше прекрасно, чтобы работать, если другой строки, как:

$str='div{3|5|6|9}[id = abc| class=image], a[id=link|class=out], br, ul'; 

в regex не захватывает br и ul.

Смежные вопросы