preg_match para nested html marcas
-
07-07-2019 - |
Pergunta
Eu gostaria de pegar todas as tags "dev" e seus respectivos conteúdos, através preg_match_all()
php, mas não pode obter os aninhados.
dados:
<dev>aaa</dev>
<dev>bbb</dev>
<dev>
ccc
<dev>ddd</dev>
</dev>
minha expressão até agora:
|<dev>(.*)</dev>|Uis
graças, por sua ajuda, b.
Solução
Não use expressões regulares para análise. Use um analisador real como DOMDocument ou SimpleXML :
$xml = simplexml_load_string('<root>'.$str.'</root>');
Outras dicas
Você precisa ter um padrão de correspondência recursiva:
/<dev>(.*|(?R))<\/dev>/i
Isso só vai sugar quaisquer elementos aninhados, por isso, se você quiser, em seguida, analisar os, você terá que executar a função novamente em $ matches [1]
O *
é um operador ganancioso, consome tantos caracteres quanto possível. Você deve usar a versão *?
não-gananciosos, em vez de encontrar as menores possíveis correspondências. Talvez expressões regulares não são as melhores ferramentas para fazer isso.