PDA

View Full Version : [PHP][Newbie] uso di split con espressioni regolari


Re_Kotc
29-08-2008, 21:47
ciao a tutti, sto cercando di splittare un array di stringhe costruite così:

<percorso>t3.mp3<\percorso>

dovrei ottenere semplicemente t3.mp3, ma non riesco a usare lo split per dirgli cosa deve fare....sapete suggerirmi? grazie mille :)

wingman87
29-08-2008, 23:57
Ciao, non mastico il php ma posso dirti che l'espressione regolare che ti serve dovrebbe essere "<.*?>"
Spero di esserti stato di aiuto, buonanotte!

kk3z
30-08-2008, 14:21
split non è la funzione giusta, usa preg_match:
$matches = array();
preg_match("#<percorso>([^<]+)</percorso>#i", $stringa_da_matchare, $matches);

$mp3 = $matches[1];

Re_Kotc
30-08-2008, 17:46
ok grazie a entrambi :-) proverò con entrambe le soluzione gracias!

Re_Kotc
31-08-2008, 16:27
mmh...usando preg_match ho qualche problemino...ti posto una sezione un pò + completa del codice, forse ho scritto qualche cavolata per cui meglio se chi se ne intende ci da un'occhiata :-)

//ho un array $contenuto che contiene n righe di testo, lo scorro in un ciclo for e se in una riga trovo la parola 'percorso' allora devo prendere il contenuto di questa riga e splittarlo in modo che partendo da questo:

<percorso>t3.mp3<\percorso> //contenuto riga

io ottenga questo:

t3.mp3 //contenuto $buffer

preg_match dovrebbe salvare in $buffer la stringa "t3.mp3" e successivamente stamparla a video..solo che mi da errori che capisco poco..e poi non ho capito se $buffer deve essere un array oppure no...mmm help!



if(strstr ($contenuto[$g],'percorso')==TRUE){



preg_match("#<percorso>([^<]+)<\percorso>#i", $contenuto[$g], $buffer);


echo $buffer[1];

kk3z
31-08-2008, 22:33
Ho capito qual'è l'errore (posta anche quelli la prossima volta): di solito i tag si chiudono con la slash (/) e non con la backslash (\), in quest'ultimo caso bisogna escaparla con un'altra backslash (\\) per evitare che il motore dell'espressione regolare cerchi di interpretarla (\p deve essere un carattere speciale delle espressioni regolari), prova con:
preg_match("#<percorso>([^<]+)<\\percorso>#i", $contenuto[$g], $buffer);

E sì, buffer è un array :)

Re_Kotc
01-09-2008, 08:59
mmm..ti ringrazio per la pazienza e le correzioni ma ancora non funziona , l'errore è sempre li nella sintassi di preg_match cioé:

Warning: preg_match() [function.preg-match]: Compilation failed: unknown property name after \P or \p at offset 20 in C:\Program Files (x86)\EasyPHP 2.0b1\www\Joomla\modules\mod_test\mod_test.php on line 179

che immagino sia proprio la barra \, qualche idea? thanks! :-)

kk3z
01-09-2008, 09:58
:wtf:

prova ad escaparlo due volte:
<?
preg_match("#<percorso>([^<]+)<\\\\percorso>#i", "<percorso>t3.mp3<\\percorso>", $matches);
print_r($matches);
?>

Re_Kotc
01-09-2008, 10:40
grandissimo!!! idolo funziona adesso! :-D....non ho capito perchè devo mettere tutte queste sequenze di escape, cmq ho visto che funziona sia con \\\\ che con \\\...ma data la mia ignoranza non so il perchè!...grazie mille!