[RISOLTO][PHP] preg_match di un array

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
52
Buongiorno a tutti gli utenti.
Premesso che sto cimentandomi nello studio del PHP e che credo di aver compreso molto bene l'uso delle regex, mi trovo con un semplicissimo script che non funziona come ci si aspetterebbe.
Il frammento di codice è la parte clou, quindi Vi risparmio l'intera stesura.
PHP:
public function trova ()
            {
                $rice = "/[0-9]{2,4}\s?[\-\.\/]?\s?[0-9]{5,8}/";
                preg_match_all ($rice, $this->frase, $trovato);
                print_r ($trovato);
                echo "<br/><br/>";
                echo "Sono stati trovati " . count($trovato[0]) . " numeri telefonici!<br/><br/>";
                $screma = "/^0w{,15}/";
                //$screma2 = "/^3w{,15}/";
                
                foreach ($trovato[0] as $elemento)
                    {
                        //echo $elemento . "<br/>";
                        
                        if (!preg_match ($screma, $elemento, $fisso))
                            {
                                echo "Non ho trovato nulla!<br/>";
                            }else{
                                echo $elemento;
                            }
                    }
                        
                echo "<br/><br/>";
                print_r ($fisso);
                echo "<br/><br/>";
                //print_r ($cellulare);
                echo "<br/><br/>";
                          
            }
Il mio programmino, dato un testo che contiene molte frasi scritte un po a caso, deve permettere l'estrapolazione di tutti i numeri telefonici (fissi e cellulari) dall'intera stringa di testo. Attraverso un primo controllo della stringa, usando "preg_match_all", vado a scremare tutti i numeri telefonici e memorizzarne ogniuno, all'interno di un ulteriore array.
L'array in questione viene riempito correttamente dai valori trovati. Essendo esso, contenitore di numeri fissi e cellulari (in pratica, numeri che cominciano per zero e numeri che cominciano per tre).
In seconda istanza, usando un semplice ciclo "foreach", controllo ogni singolo elemento dell'array appena creato e, con l'aiuto di "preg_match", scremare ulteriormente ogni singolo numero fisso (che comincia per zero) e andarlo a memorizzare in un altro array.
La funzione "print_r", mostra semplicemente un array completamente vuoto.
Sinceramente non capisco dove stia il problema, dato che ho fatto e rifatto mille prove inutili in 2 ore.
Riuscite ad aiutarmi a risolvere l'enigma?
In allegato lo screenshot di ciò che viene stamapto a video.
Grazie anticipate.
 

Allegati

  • risultatoPHP.JPG
    risultatoPHP.JPG
    53,2 KB · Visite: 434
ciao
io, salvo rare eccezioni, non amo le regex quindi ti propongo questo
PHP:
<?php
//....
$trovato[0]=array('0235987','333333','0524-33333');//array per prova
//$screma = "/^0w{,15}/";
//$screma2 = "/^3w{,15}/";
                
foreach ($trovato[0] as $elemento){
    if (substr($elemento, 0, 1) >0){
        //echo "Non ho trovato nulla!<br/>"
        $cellulare[]=$elemento;
    }else{
        $fisso[]=$elemento;
    }
}                     
echo "<pre>tel. fissi<br/>";
print_r ($fisso);
echo "<br/>tel. cellulari<br/>";
print_r ($cellulare);
echo "</pre>";
?>
 
ciao
io, salvo rare eccezioni, non amo le regex quindi ti propongo questo
PHP:
<?php
//....
$trovato[0]=array('0235987','333333','0524-33333');//array per prova
//$screma = "/^0w{,15}/";
//$screma2 = "/^3w{,15}/";
               
foreach ($trovato[0] as $elemento){
    if (substr($elemento, 0, 1) >0){
        //echo "Non ho trovato nulla!<br/>"
        $cellulare[]=$elemento;
    }else{
        $fisso[]=$elemento;
    }
}                    
echo "<pre>tel. fissi<br/>";
print_r ($fisso);
echo "<br/>tel. cellulari<br/>";
print_r ($cellulare);
echo "</pre>";
?>
Grazie Borgo-Italia, intanto faccio tesoro dell'uso della funzione "substr" che non ricordavo più, dato che sono solo alcuni mesi che studio PHP e non ho avuto modo di usarla. Questo aiuta a sviare il problema ma lasciando irrisolto il dilemma. Volevo concludere al meglio lo studio delle regex, quindi vorrei arrivare al risultato, usandole.
 
PHP:
<?php
//....
$trovato[0]=array('0235987','333333','0524-33333');//array per prova
$screma = "/\A0/";//inizia per 0 : \A inizio stringa
foreach ($trovato[0] as $elemento){
    if (!preg_match($screma,$elemento)){
        //echo "Non ho trovato nulla!<br/>"
        $cellulare[]=$elemento;
    }else{
        $fisso[]=$elemento;
    }
}                     
echo "<pre>tel. fissi<br/>";
print_r ($fisso);
echo "<br/>tel. cellulari<br/>";
print_r ($cellulare);
echo "</pre>";
?>
 
PHP:
<?php
//....
$trovato[0]=array('0235987','333333','0524-33333');//array per prova
$screma = "/\A0/";//inizia per 0 : \A inizio stringa
foreach ($trovato[0] as $elemento){
    if (!preg_match($screma,$elemento)){
        //echo "Non ho trovato nulla!<br/>"
        $cellulare[]=$elemento;
    }else{
        $fisso[]=$elemento;
    }
}                    
echo "<pre>tel. fissi<br/>";
print_r ($fisso);
echo "<br/>tel. cellulari<br/>";
print_r ($cellulare);
echo "</pre>";
?>
Beh, hai risolto senza problemi, usando le regex. Sei stato molto gentile.
Ma se tu potessi spiegare il motivo perchè il mio script non funziona, cosa mi diresti? Perchè il mio "preg_match" non memorizza il valore che trova usando l'opzione di memorizzazione dato? Allego il codice che scrissi in precedenza.
PHP:
public function trova ()
            {
                $rice = "/[0-9]{2,4}\s?[\-\.\/]?\s?[0-9]{5,8}/";
                preg_match_all ($rice, $this->frase, $trovato);
                print_r ($trovato);
                echo "<br/><br/>";
                $screma = "/^0[1-9]{1}[0-9]{,2}\s?[\.\-\/]?\s?[0-9]{5,8}/";
                //$screma2 = "/^3[1-9]{1}[0-9]{1}\s?[\.\-\/]?\s?[0-9]{7}/";
                foreach ($trovato[0] as $elemento)
                    {
                        echo $elemento . "<br/>";
                    
                        
                        preg_match ($screma, $elemento, $fisso);
                    }
                        
                echo "<br/><br/>";
                print_r ($fisso);
                //print_r ($cellulare);
                echo "<br/><br/>";
            }
 
Beh, hai risolto senza problemi, usando le regex. Sei stato molto gentile.
Ma se tu potessi spiegare il motivo perchè il mio script non funziona, cosa mi diresti? Perchè il mio "preg_match" non memorizza il valore che trova usando l'opzione di memorizzazione dato? Allego il codice che scrissi in precedenza.
PHP:
public function trova ()
            {
                $rice = "/[0-9]{2,4}\s?[\-\.\/]?\s?[0-9]{5,8}/";
                preg_match_all ($rice, $this->frase, $trovato);
                print_r ($trovato);
                echo "<br/><br/>";
                $screma = "/^0[1-9]{1}[0-9]{,2}\s?[\.\-\/]?\s?[0-9]{5,8}/";
                //$screma2 = "/^3[1-9]{1}[0-9]{1}\s?[\.\-\/]?\s?[0-9]{7}/";
                foreach ($trovato[0] as $elemento)
                    {
                        echo $elemento . "<br/>";
                   
                       
                        preg_match ($screma, $elemento, $fisso);
                    }
                       
                echo "<br/><br/>";
                print_r ($fisso);
                //print_r ($cellulare);
                echo "<br/><br/>";
            }
Cioè, perchè l'array che io ho chiamato "$fisso", non viene valorizzata?
 

Discussioni simili