Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
PHP - Sottogruppi Regex con la funzione preg_match
Forum - PHP - Sottogruppi Regex con la funzione preg_match

Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:59
Venerdì, 17/08/2012
Salve a tutti, mi sono ritrovato a dover scrivere una calsse per la gestione dei tag XML. Sono arrivato al punto di creare una regex che permetta l'analisi di quest'ultimi nodo per nodo:
Codice sorgente - presumibilmente Plain Text

  1. /<([a-z]+)( ([a-zA-Z0-9]+)="([^"]*)")*>(.*)<\/\1>/


Il pattern funziona e riconosce anche tag del tipo
Codice sorgente - presumibilmente Plain Text

  1. <nodo atr1="val1" atr2="val2">contenuto</nodo>


Se però voglio usare la funzione preg_match per risalire hai dati contenuti nel suddetto tag i gruppi 2,3 e 4 vengono sovrascritti dall'ultimo attributo. Per esempio nel caso sopraindicato l'array di matches sarà:
Codice sorgente - presumibilmente PHP

  1. Array ( [0] => contenuto [1] => nodo [2] => atr2="val2" [3] => atr2 [4] => val2 [5] => contenuto )


La mia domanda è se esiste un modo per estrarre questi valori in un array bidimensionale senza dover rianalizzare ogni attributo per conto suo.
Grazie in anticipo.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:07
Venerdì, 17/08/2012
Non riesco a capire la domanda... potresti spiegarti meglio?


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 9:31
Sabato, 18/08/2012
si praticamente il secondo gruppo permette la ripetizione degli attributi nel formato attr="val" nel caso vi siano piu attributi nell array matches che vado a generare con
Codice sorgente - presumibilmente Plain Text

  1. preg_match('/<([a-z]+)( ([a-zA-Z0-9]+)="([^"]*)")*>(.*)<\/\1>/', '<nodo atr1="val1" atr2="val2">contenuto</nodo>', $matches);


otterro solo l'ultimo attributo e gli altri vengono sovrascritti.
vorrei sapere se è possibile ottenere un array es
Codice sorgente - presumibilmente PHP

  1. Array ( [0] => contenuto [1] => nodo [2] => array(atr1 => val1, atr2 => val2) [3] => contenuto )


Capito?! cosi da avere tutti gli attributi in un array all'interno del gruppo 2
Spero adesso di essere stato chiaro e mi scuso per il primo post

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:53
Sabato, 18/08/2012
Con le espressioni regolari non penso sia possibile fare quello che chiedi in un solo passo. Potrebbe essere possibile usare questa (in maniera impropria) http://www.php.net/manual/en/function.preg-replace-callbac ... facendo in modo che non avvenga nessuna sostituzione e usare la callback per memorizzare i risultati (visto che la callback viene chiamata ad ogni match). Ma non mi sembra sia la soluzione piu' corretta.

Darei piuttosto un'occhiata a questo: http://php.net/manual/en/class.domdocument.php

E' fatto apposta per analizzare XML.


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:38
Lunedì, 20/08/2012
Ok, ho passato tanto tempo a provare con SimpleXMLElement ma con scarsi risultati, il dom mi era stato sconsigliato per la sua difficoltà, a questo punto però ci proverei, se non riesco col dom passo a un regex ripetuta. Grazie per i consigli ;-)

PM Quote