Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777

    [PHP]ripetizione carattere

    è possibile contare quante volte un carattere si ripete consecutivamente in una stringa?
    io devo contare gli accapo
    se un utente scrive nella textarea
    cosi: ciao a \n\n\n\ntutti
    io vorrei che cancellare \n e lasciarne solo due.

    ho fatto infatti una funzione in cui un accapo me lo sostituisce con br e due con i tag p.
    vorrei impedire dunque troppi accapo consecutivi

    finora il codice che ho scritto girando e girando nel web per prendere spunto e questo
    Codice PHP:
    function nl2p($st){

    $ststr_replace("\r\n\r\n","</p> 

    "
    $st);
    $ststr_replace("\n\r\n\r","</p> 

    "
    $st);
    $ststr_replace("\r\r","</p> 

    "
    $st);
    $ststr_replace("\n\n","</p> 

    "
    $st);
    $ststr_replace("\n\r""
    "
    $st);
    $ststr_replace("\r\n""
    "
    $st);
    $ststr_replace("\r""
    "
    $st);
    $ststr_replace("\n""
    "
    $st);

    return 
    $st;
    }

    $commentomysql_real_escape_string(nl2p($_POST['commento']));
    $commentostrip_tags(trim($commento),"[b][i]<u><a>


    "
    ); 

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    codice:
    $stringa = preg_replace( "/(\\n\\n)(\\n*)(.*)/" , "$1$3" , $stringa);
    Questo sostituisce \n ripetuto N volte (con N> 2) con \n ripetuto due volte

    In generale la funzione che cerchi è preg_replace e non str_replace, poichè la seconda (str_replace) richiede che tu sappia in anticipo esattamente quante volte \n appare nella tua stringa e ciò non è possibile


    Questo invece
    codice:
    $stringa = preg_replace( "/\\r\\n\\r\\n([\\r\\n\\]*)(.*)/" , "\\n\\n$2" , $stringa);
    Sostituisce \r\n che si ripete 3 o più volte cone \n ripetuto 2 volte

    Da come sono strutturate questi due suggerimenti e dal funzionamento di preg_replace dovresti essere in grado di fare tutto quello che ti serve

    Ad esempio queste due istruzioni in sequenza sostituiscono tutti i \r\n con \n e dopo ogni sequenza di \n superiore a 2 in due \n

    codice:
    $stringa = preg_replace( "/\\r\\n/" , "\\n" , $stringa ); $stringa = preg_replace( "/\\n\\n[\\n]*(.*)/" , "\\n\\n$1" , $stringa );
    Le espressioni regolari, se imparate e usate correttamente, sono molto potenti

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    capito grazie, sono ancora un principiante ma sto imparando a usarle

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    quindi se non ho capito male
    la funzione sarebbe
    Codice PHP:
    function nl2p($st){
    $st preg_replace"/\\r\\n/" "\\n" $st ); 
    $st preg_replace"/\\n\\n[\\n]*(.*)/" "\\n\\n$1" $st );
    $ststr_replace("\n\n","</p> 

    "
    $st);
    $ststr_replace("\n""
    "
    $st);
    return 
    $st;

    giusto?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    Si, a parte che gli \ devono essere sostituiti con \\ perchè come carattere speciale va fatto l'escape

    Quindi
    codice:
    function nl2p($st){
    $st = preg_replace( "/\\r\\n/" , "\\n" , $st ); 
    $st = preg_replace( "/\\n\\n[\\n]*(.*)/" , "\\n\\n$1" , $st );
    $st= str_replace("\\n\\n","</p> 
    
    ", $st);
    $st= str_replace("\\n", "
    ", $st);
    return $st;
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    ok giusto per imparare mi traduci in parole cosa significa
    Codice PHP:
    $st preg_replace"/\\n\\n[\\n]*(.*)/" "\\n\\n$1" $st ); 

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    Originariamente inviato da amphioxus
    ok giusto per imparare mi traduci in parole cosa significa
    Codice PHP:
    $st preg_replace"/\\n\\n[\\n]*(.*)/" "\\n\\n$1" $st ); 
    Allora

    la prima stringa "/\\n\\n[\\n]*(.*)/" è quella da "cercare" e analizziamola
    il primo "/" e l'ultimo "/" sono i delimitatori della ricerca
    La stringa dice: cerca \n\n seguito da \n ripetuto un numero variabile di volte ( "[\\n]*" ) il tutto seguito da qualsiasi sequenza di caratteri ( ".*", poichè "." significa "qualsiasi cosa" mentre * indica "ripetuto 0 o più volte ); racchiudendo tra parentesi tonde la cosa, si permette alla seconda stringa di recuperare il valore tramite $1 ($2, $3 eccetera se si hanno più coppie di parentesi nella stringa)

    La seconda stringa dice con cosa sostituire ogni "successo" della ricerca e analizziamola
    La stringa dice: sostituisci con "\n\n" seguito da ciò che è racchiuso nella prima coppia di parentesi tonde ( in questo caso $1 è quindi uguale a ".*" ).

    Chiaro?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    chiaro grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    L'utilizzo delle "espressioni regolari" può sembrare un po' ostico all'inizio, ma se compreso a dovere, è veramente potente

    Immagina di voler verificare se un campo contiene un indirizzo mail valido e immaginiamo per "valido" qualsiasi sequenza di caratteri, numeri, "_" e "-" e "." seguito da "@" seguito da una sequenza di caratteri, numeri "_" e "-", seguito da "." seguito da "it/com/org/net", ignorando maiuscole e minuscole

    Basta fare questo
    codice:
    if ( preg_match( "/^[a-z0-9_\-\.]+@[a-z09_\-]+\.[it|com|org|net]/i" , $stringa ) ) {
    ....
    } else {
      echo "errore";
    ....
    }
    Ecco un piccolo tutorial
    http://php.html.it/articoli/leggi/85...ioni-regolari/

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    grazie dell'aiuto e delle spiegazioni

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.