consiglio preg_match_all

  • Creatore Discussione Creatore Discussione james81
  • Data di inizio Data di inizio

james81

Utente Attivo
14 Set 2010
72
0
0
Ciao a tutti,
ho un consiglio da chiedervi:
ho un tag <h2></h2> nel quale è contenuto un'indirizzo:
Es.
HTML:
<h2>
        <a href="http://www.suto.it/aaa/bbbb" >nome</a>
</h2>

ora volevo utilizzare preg_match_all per prelevare l'indirizzo (http://www.suto.it/aaa/bbbb) e il nome, è possibile ?

Grazie
 
Ultima modifica di un moderatore:
Per una sola ripetizione ti basta preg_match(); Ecco un esempio:
PHP:
<?php

$testo = '<h2>
<a href="http://www.suto.it/aaa/bbbb">nome</a>
</h2>';

preg_match('#<a href="(.+)">(.+)</a>#', $testo, $matches);

var_dump($matches[1]); // indirizzo
var_dump($matches[2]); // nome

?>

Se ci fossero, invece, più link puoi usare preg_match_all() in questo modo:
PHP:
<?php

$testo = '<h2>
<a href="http://www.suto.it/aaa/bbbb">nome</a>
</h2>
<h2>
<a href="http://www.suto.it/ccc/ddd">altro</a>
</h2>';

preg_match_all('#<a href="(.+)">(.+)</a>#', $testo, $matches);

var_dump($matches[1]); // indirizzi
var_dump($matches[2]); // nomi

?>
 
ho notato una cosa nel codice della pagina che il valore dentro alla cella è a capo, può centrare qualcosa ?
 
Puoi raffinare l'espressione regolare per catturare anche gli eventuali caratteri a capo, tabulazione ecc. Per esempio:
PHP:
preg_match('#<a\s[^>]*href\s*=\s*"(.+)"[^>]*>\s*([\s\S]*\S+)\s*</a>#', $testo, $matches);
 
ok, alla fine sono riuscito almeno spero!
volevo vista la gentilezza chiederti un chiarimento:
nei campi che leggo ho la necessità di prelevare un'indirizzo che viene visualizzato così :

Via Rossi, 56
32112 Buggio Sopra (RM)

ora vorrei riuscire a scorporare la viacon il numero civico compreso, il CAP(32112) , PAESE(Buggio Sopra) e PROVINCIA(RM)
 
Via Rossi, 56
32112 Buggio Sopra (RM)

Ti ho scritto qualcosa al volo:
PHP:
#> Elenco vie (la riga vuota tra l'una e l'altra non è obbligatoria)
$str = "Via Rossi, 56
32112 Buggio Sopra (RM)

Via Carlo, 156
04052 Città a caso (MI)

Via Del Toro, 1
10100 Amor di Città (TO)";

#> Riconosciamo le informazioni degli indirizzi
preg_match_all("#([^\n,]+),\s+([0-9]+)\s+([^\s]+).*?([^(]+)\(([^)]+)\)#i", $str, $output);

#> Mostriamole in modo ordinato così da avere un idea di cosa ha fatto la regexp
echo '<pre>', print_r($output, true), '</pre>';


Per un indirizzo singolo, ti basta usare il preg_match al posto del preg_match_all.
 
Codice:
$varindirizzo = "ViaRoma,1613000RomaSud(RM)";  
preg_match("#([^\n,]+),\s+([0-9]+)\s+([^\s]+).*?([^(]+)\(([^)]+)\)#i", $varindirizzo, $output);
#> Mostriamole in modo ordinato così da avere un idea di cosa ha fatto la regexp
echo '<pre>', print_r($output, true), '</pre>';
 
ho sbagliato! la variabile $varindirizzo è così:

$varindirizzo =" Via Roma, 16
13000 Roma Sud (Rm) ";
 
PHP:
$varindirizzo =" Via Roma, 16
13000 Roma Sud (Rm) "; 

preg_match("#([^\n,]+),\s+([0-9]+)\s+([^\s]+).*?([^(]+)\(([^)]+)\)#i", $varindirizzo, $output);
echo '<pre>', print_r($output, true), '</pre>';

Copiando il codice così com'è output mi viene mostrata così:

Codice:
Array
(
    [0] =>  Via Roma, 16
13000 Roma Sud (Rm)
    [1] =>  Via Roma
    [2] => 16
    [3] => 13000
    [4] =>  Roma Sud 
    [5] => Rm
)

L'ho provato da due computer diversi, con due versioni di PHP diverse e stesso risultato.
A questo punto sei sicuro che la stringa che passi alla regexp sia effettivamente composta a quel modo ? Ti invito comunque a fare una prova in uno script php in cui scrivi solo questo pezzo di codice preso in esame (per testare se almeno di base le regole che ho scritto funzionano, perché se non vanno allora c'è qualcosa di strano).
 
ho provato a scrivere manualmente la stringa da passargli e effettivamente lo script funziona, come dici te sarà a stringa che gli passo che non è corretta....ho controllato e c'era un <br /> che disturbava, l'ho sostituito e al momento semba che sia tutto ok
 
Ultima modifica:
ho alcuni indirizzo che nel numero civico sono composti es.

Via Roma, 16\17 13000 Roma Sud (Rm)
Via Roma, 16bis 13000 Roma Sud (Rm)
Via Roma, 16int1 13000 Roma Sud (Rm)
 
PHP:
<?php

$varindirizzo ="
Via Roma, 16\\17
13000 Roma Sud (Rm)

Via Roma, 16bis
13000 Roma Sud (Rm)

Via Roma, 16int1
13000 Roma Sud (Rm) ";
 
preg_match_all("#([^,]+),\s([\S]+)\s([0-9]{5})\s([^(]+)\s\(([a-z]{2})\)#i", $varindirizzo, $output);

echo '<pre>', print_r($output, true), '</pre>';

?>
 

Discussioni simili