Quando Regex non ti semplifica la vita… ci pensa PHP

Quando Regex Non Ti Semplifica La Vita

Mi è arrivata una richiesta molto particolare dal mio sito.

La richiesta era questa: il mio interlocutore aveva bisogno di trasformare un testo con queste righe

#EXTINF:-1,——-=======[ TESTO PROVA 1 ]=======——-
http://www.google.com

#EXTINF:-1,——-=======[ TESTO PROVA 2 ]=======——-
https://www.tiscali.it

#EXTINF:-1,—-====[ TESTO PROVA 3 ]====—-
https://www.libero.it

#EXTINF:-1,TESTO PROVA 4
https://www.virgilio.it

#EXTINF:-1,TESTO PROVA 5
http://www.fastweb.it

#EXTINF:-1,—===[ TESTO PROVA 6 ]===—
http://www.google.it

in un testo del genere:

http://www.google.com #EXTINF:-1,——-=======[ TESTO PROVA 1 ]=======——-
https://www.tiscali.it #EXTINF:-1,——-=======[ TESTO PROVA 2 ]=======——-
https://www.libero.it #EXTINF:-1,—-====[ TESTO PROVA 3 ]====—-
https://www.virgilio.it #EXTINF:-1,TESTO PROVA 4
http://www.fastweb.it #EXTINF:-1,TESTO PROVA 5
http://www.google.it #EXTINF:-1,—===[ TESTO PROVA 6 ]===—

In sostanza doveva eliminare le righe vuote, anticipare la seconda riga sulla prima e separarla con uno spazio.

Voleva eseguire questa operazione con Notepad++ con regole Regex, perchè leggendo gli articoli nel mio blog pareva che con Regex si potesse fare qualsiasi miracolo.

Ma, in questo caso, la richiesta era un po’ troppo complicata per il Regex. Si pretendeva un po’ troppo da lui. In effetti Regex permette di analizzare una stringa per controllare se risponde ad una data regola. Se si usa Notepad++ Regex va bene se si analizza una riga alla volta, ma già quando serve vedere un complessivo (riga pari e riga dispari e poi togliere la terza riga vuota) allora è un po’ troppo per lui.

Allora ho creato un piccolo script in PHP che da un file di testo chiamato test.txt ne preparava uno nuovo (test1.txt) con le caratteristiche richieste.

Così:

<?php    
 $DELETE = "";

 $data = file("./test.txt");

 $out = array();

 foreach($data as $key=>$line) {
     if(trim($line) != $DELETE) {
		 if (str_starts_with($line, '#')) {
			$out[] = trim(preg_replace('/\s\s+/', ' ', $data[$key+1])).' '.$line;
		 }
     }
 }

 $fp = fopen("./test1.txt", "w+");
 flock($fp, LOCK_EX);
 foreach($out as $line1) {
     fwrite($fp, $line1);
 }
 flock($fp, LOCK_UN);
 fclose($fp);  
?>  

Cerco di spiegare questo script in maniera semplice.

$DELETE = “”;
Qui viene dichiarata la stringa (la riga) che si vuol togliere, potrebbe essere benissimo una qualsiasi stringa invece che vuota come in questo caso.

$data = file(“./test.txt”);
Qui si dice a PHP leggi questo file.

$out = array();
Viene dichiarato l’array $out.

foreach($data as $key=>$line) {
Viene costruito il ciclo in modo che venga letta ogni linea. $data è un array contenente al suo interno tutte le linee del file. $key è un indice (riga 1, riga 2, riga 3, ecc…). $line è la singola linea. Una stringa contenente la singola riga di testo.

if(trim($line) != $DELETE) {
Istruzione condizionale: se la riga di testo (da cui sono stati tolti gli spazi iniziali e finali, per sicurezza) non è uguale alla stringa da cancellare (cioè la stringa vuota in questo caso) allora fai….

if (str_starts_with($line, ‘#’)) {
Faccio un altro controllo: se la riga di testo comincia con il carattere ‘#’ allora…

$out[] = trim(preg_replace(‘/\s\s+/’, ‘ ‘, $data[$key+1])).’ ‘.$line;
mi popoli l’array precedentemente creato in questo modo:
– la riga successiva a quella analizzata da cui sono stati tolti gli spazi vuoti iniziali e finali e da cui sono stati tolti i caratteri di a capo (invisibili ma presenti nel file di testo)
– metti uno spazio
– aggiungi la riga che stai analizzando, cioè quella che comincia con il carattere ‘#’
Il ciclo scorrerà tutto il file praticamente ignorando le righe vuote e le righe contenenti gli url.
Alla fine del ciclo abbiamo un array ($out) che è contiene le righe che vogliamo salvare nel formato corretto.
Bisogna quindi creare un nuovo file.

$fp = fopen(“./test1.txt”, “w+”);
Qui si apre in scrittura un nuovo file chiamato test1.txt che inizialmente è vuoto.

foreach($out as $line1) {
Con questo ciclo si vuole per ogni record dell’array $out che si chiama $line1

fwrite($fp, $line1);
andare a scrivere nel file da poco creato, riga per riga.

fclose($fp);
Una volta che si è scritto il file, bisogna salvarlo. Ed il gioco è fatto.

In questo modo si può ottenere un file test1.txt scritto come si desidera.

Contattami se hai bisogno di aiuto per casi del genere. Php può essere la soluzione per velocizzare delle operazioni che sembrano complicatissime.

Richiedi informazioni

Raccontami il tuo progetto, tracking, accessibilità, campagne adv da sistemare o semplicemente un sito che non vuol saperne di funzionare. Insieme possiamo migliorarlo.

    Accetto la Privacy Policy
    Autorizzo al trattamento dei miei dati personali, per ricevere le informazioni richieste attraverso questo modulo di contatto. I dati da te inseriti attraverso questo modulo verranno utilizzati solo per essere da me ricontattato.

    Recensioni

    Pubblicato su Google Google
    Flavio Corò profile picture
    Flavio Corò
    22/09/2023
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Ho avuto il piacere di contattare la Sig.ra Sara tramite suggerimento da parte di un mio cliente per riisolvere una pratica burocratica/lavorativa e devo dire che la VELOCITÀ, PROFESSIONALITÀ, e COMPETENZA fanno parte del Suo bagaglio lavorativo,qualita al giorno d'oggi per niente scontate.Pienamente soddisfatto.
    Pubblicato su Google Google
    Sonico Beauty profile picture
    Sonico Beauty
    17/01/2023
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Sara ci ha aiutato a risolvere piu' problemi in pochi minuti e con molta professionalità. Massima disponibilità e grande conoscenza nel mondo web. Assolutamente consigliata. Grazie mille
    Pubblicato su Google Google
    Studio Legale Avvocato Armando Baffioni Venturi profile picture
    Studio Legale Avvocato Armando Baffioni Venturi
    07/11/2022
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Contattata tramite il suo sito web si è rivelata una persona affabile e preparata, pronta nel recepire le mie necessità e nel darmi le indicazioni corrette da seguire. Assolutamente da consigliare anche per assistenze e consulenze da remoto.
    Pubblicato su Google Google
    Hermann Gils profile picture
    Hermann Gils
    28/10/2022
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Molto esperta, preparata e competente!
    Pubblicato su Google Google
    Antonio Cimadomo profile picture
    Antonio Cimadomo
    07/08/2022
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Definire La Sig.a Sara Gasparini persona capace, Umile, molto intelligente e disponibile è il minimo che si possa fare. E' stata una grande emozione per me averla 'scovata'. Persone come Sara alzano, e di tanto, il livello sociale/culturale. Ringrazio ancora Sara per esserci.... Antonio p.s. Peccato ci siano solo 5 stelle :-(
    Pubblicato su Google Google
    Max R_DJ profile picture
    Max R_DJ
    16/06/2021
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Molto professionale e preparata, ha risolto subito un mio problema inerente alle recensioni Google sul mio sito web. Complimenti Sara!
    Pubblicato su Google Google
    Fabrizio Aureli profile picture
    Fabrizio Aureli
    18/03/2021
    Google star 1Google star 2Google star 3Google star 4Google star 5Trustindex verifica che la fonte originale della recensione sia Google.
    Ottima collaboratrice

    Scrivimi una recensione

    Questo QR Code ti permette di lasciarmi una recensione in maniera facile e veloce.

    Altrimenti usa il bottone qui sotto.

    Lascia una recensione su Google