Visualizzazione risultati 1 fino 7 di 7

Discussione: preg_replace su più righe.

  1. #1
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito preg_replace su più righe.

    Buongiorno

    mi serve fare con PHP questa operazione:

    - Aprire un file (un csv)
    - Eliminare dal file aperto un carattere (il separatore) presente alla fine di ogni riga
    - Salvare il file corretto.

    Questo perchè la prima riga, quella con l'intestazione, non ha il carattere alla fine, mentre TUTTE le altre ce l'hanno, per cui elaborando il file mi trovo con un numero di campi maggiore rispetto ai campi mappati (poichè quel ";" alla fine crea un campo vuoto in più).

    Ho provato così:

    Codice PHP:
    $file = "path/al/file.csv";

    $file_content = file_get_contents($file);
    $p = "/;$/mi";
    $file_content = preg_replace($p, "", $file_content, -1);

    echo
    $file_content;
    Ma ottengo sempre e solo che la sostituzione viene fatta sull'ultima riga, le altre non vengono toccate.
    Ho provato ad usare anche il modificatore "D" ma niente, il risultato non cambia.

    Pensavo che potrei aprire e analizzare il file una riga alla volta, ma vorrei fare tutto in un solo passaggio.
    Come posso fare?

    Grazie.

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Eseguendo quel codice su questo file CVS:
    Codice:
    a;b;c;
    d;e;f;
    ottengo il risultato desiderato, ovvero:
    Codice:
    a;b;c
    d;e;f
    Dunque immagino che il problema possa essere nel file CSV che non rispetta esattamente la struttura che ti aspetti. Per esempio, se tutte le righe tranne l'ultima contengono uno spazio dopo il separatore, si ottiene quanto hai descritto.

    Controlla bene il CSV e la sua struttura.

    I suggerimenti che do più spesso:


  3. #3
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito

    Ho controllato il file e le righe non hanno nulla in particolare, finiscono con un ";" e il ritorno a capo.
    Però continuo ad avere come risultato la sostituzione nella sola ultima riga.

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Hai provato con questo CSV?
    Codice:
    a;b;c;
    d;e;f;

    I suggerimenti che do più spesso:


  5. #5
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito

    Provato in locale (XAMPP provato sia con php 5.4 che 7.0) e NON funziona. O meglio funziona nel modo che ho descritto, agendo solo sull'ultima riga.
    Provato qui su AlterVista e funziona e toglie il ; da tutte le righe.

    Adesso dovrò cercare e capire il perchè di questo comportamento.
    Ultima modifica di phollia : 15-07-2018 alle ore 20.10.53

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Immagino che in locale tu stia usando Windows in locale: questo spiegherebbe tutto.

    Il $ di fine riga non funziona molto bene in Windows, per via del modo in cui esso codifica la fine di una riga.

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Per impostazione predefinita, PCRE considera la stringa dell'oggetto come costituita da una singola "linea" di caratteri (anche se in realtà contiene diverse nuove righe).
    Il problema che descrivi può essere riconducibile anche dal fatto che non riconosce il modificatore "m" puoi accurare questo eseguendo due operazioni: 1)Elimina la cache del tuo browser (tutta la cache e non la singola pagina poi chiudi il browser e dopo apri nuovamente) 2)provi questo script per vedere se funziona il modificatore "m"
    Codice PHP:
    <?php
    $file
    = "a;b;c\nd;e;f;\ng;h;i;\n";

    $file_content = $file;
    $p = "/;\$/m";
    $file_content = preg_replace($p, "", $file_content, -1);

    echo
    $file_content;
    ?>
    Mi sono permesso di inserire un backslash dal momento che il "$" è un carattere riservato in una stringa racchiusa da doppi apici (performance più che altro) e ho tolto case-insesitive dal momento che non esiste una forma maiuscola o minuscola per i caratteri punto e virgola e fine linea. (Però mi sembra strano che non sono campi uguali dal momento che il file CSV riempie i campi minori con un campo vuoto)..
    Se dalla prova ottieni solo la sostituzione dell'ultima riga è evidente che il modificatore "m" non sta funzionando..
    Cioè trova l'ultima occorrenza di ";" con o senza accapo $p= "/;\$/";
    Ultima modifica di darbula : 17-07-2018 alle ore 20.42.05

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •