PHP, preg_match, espressione regolare. Che cosa sto facendo di sbagliato?
-
19-09-2019 - |
Domanda
Ecco il modello che voglio abbinare:
<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">
Questo è quello che sto facendo:
$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';
preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);
print_r($matches);
Esso stampa:
Array ()
Soluzione
Come regola generale, le espressioni regolari sono uno strumento veramente poveri di parsing del codice HTML. Sono inaffidabili e tendono a finire per essere davvero complicato. Una soluzione molto più robusto è quello di utilizzare un parser HTML. Vedere Parse HTML con PHP e DOM .
Per quanto riguarda la tua espressione, non vedo <div class="productTitle"
in qualsiasi parte del sorgente in modo avrei cominciato lì. Allo stesso modo si sta cercando di analizzare un URL, ma non c'è alcuna menzione del tag di ancoraggio (direttamente o tramite un jolly sufficiente) in modo che verrete a mancare anche lì. In sostanza che l'espressione non sembra nulla di simile il codice HTML si sta cercando di analizzare.
Altri suggerimenti
... O questo:
preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);
TRIM troppo.
Il pattern:
/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m
Sarebbe ottenere il link e il testo più o meno, ma usando la libreria DOM sarebbe un metodo molto migliore.
Si può provare questo:
<a href=".*?">([\s\S]*?)</a>