Visualizzazione risultati 1 fino 9 di 9
Like Tree1Likes
  • 1 Post By diegovieni

Discussione: Verificare presenza spazi in una stringa

  1. #1
    diegovieni non è connesso Neofita
    Data registrazione
    22-03-2017
    Messaggi
    9

    Post Verificare presenza spazi in una stringa

    Buonasera,
    perdonate la domanda inutile, ma è un bel po' di tempo che non utilizzo PHP.
    Avrei la necessità di fare un controllo di spazi all'interno di una stringa. Ho provato con alcuni preg_replace ed strpos. Il codice dovrebbe essere il seguente:

    Codice PHP:
    $str = "Ciao a tutti";
    if(
    strpos($str, ' ' ) ){
    echo
    "La stringa contiene spazi";
    }else{
    echo
    "Non contiene spazi";
    }
    ma, il problema è che, se metto un carattere speciale come "+", esso mi torna errore come se lo contasse come spazio.
    Avete soluzioni alternative? Grazie in anticipo.

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

    Predefinito

    Il carattere "+" in questa query string http://condominio.com/index.php?prova=sono+io (in php corrisponde alla funzione $_GET con chiave prova o similare a essa o altre funzioni che usano il percent encoding) che decodifica il percent encoding della query string internamente. Originale con percent encoding "+" con decodifica " ". Javascript adotta altra codifica dove il carattere spazio è rappresentato da %20.
    Browser: http://condominio.com/index.php?prova=sono+io
    PHP:
    Codice PHP:
    if(isset($_GET['prova']) && is_string($_GET['prova']) && strlen($_GET['prova']) != 0);
    if(
    is_int(strpos($_GET['prova'], ' ')))
    echo
    'carattere con spazio';
    else
    echo
    'altra circostanza comunque non valida';
    Ultima modifica di darbula : 16-10-2021 alle ore 23.27.22

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Occhio che devi controllare se la funzione ritorna false: nel tuo caso, se metti lo spazio come primo carattere, strpos ritornerà 0 (lo spazio è al carattere zero), risultando però la condizione dell'if falsa.

    Citazione Originalmente inviato da diegovieni Visualizza messaggio
    ma, il problema è che, se metto un carattere speciale come "+", esso mi torna errore come se lo contasse come spazio.
    A me entrambi questi casi risulta "non contiene spazi":
    Codice PHP:
    <?php
    //$str = "testo+";
    $str = "+";
    if(
    strpos($str, ' ' ) === false){
    echo
    "Non contiene spazi";
    }else{
    echo
    "La stringa contiene spazi";
    }

    Puoi mostrare il problema che descrivi con il carattere '+'?

    Ciao!

  4. #4
    diegovieni non è connesso Neofita
    Data registrazione
    22-03-2017
    Messaggi
    9

    Predefinito

    Grazie ad entrambi per le risposte. @darbula sarà sicuramente un problema di percent encoding come hai accennato tu. Nulla che posso risolvere con un urlencode(), htmlspecialchars() o qualcosa di simile? Ho provato sia con questi ultimi che con utf8_encode(), ma niente.

    @alemoppo stessa cosa. Il risultato è sempre lo stesso. La pagina di registrazione invia i dati, in jQuery, ad una pagina php che controlla il form. Che sia un problema di codifica jQuery? Allego codice:

    Codice HTML:
    $(document).ready(function() {
    $("#bottone").click(function(){
    var nome = $("#nome").val();
    
    $.ajax({
    type: "POST",  
    url: "pagina.php",
    data: 
    "&nome=" + nome,  
    
    dataType: "html",
    
    success: function(msg){
    alert("Riuscito."); 
    },
    error: function(){
    alert("Errore nel server. Riprovare."); 
    }
    });
    });
    });
    Il problema, come si può notare, viene riscontrato con il campo del nome.

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

    Predefinito

    PHP è un linguaggio interpretato $_GET o $_REQUEST o $_POST o funzioni con percent encoding usano internamente urldecode($_POST['nome']) è una scelta dei programmatori che creano il sorgente php.
    Comunque una query string (o invio dati GET) o invio dati POST con enctype application/x-www-form-urlencoded e in taluni casi anche con multipart/form-data (solo il file usa una codifica diversa ma gli elementi di una form html sono uguali al precedente enctype).
    Il carattere separatore "&" va utilizzato solo dopo la prima coppia di chiave valore, cioè nome=darbula&chiave2=valore2.
    Per ajax passare direttamente una stringa significa che è già in percent encoding (detto con altre parole
    è tua cura creare o usare una funzione per verificare e convertire in percent encoding, cioè il modo corretto per inviare i dati) altrimenti usa un PlainObject. Il problema non è in php ma passi erroneamente una stringa non convertita in percent encoding.
    Leggi la documentazione per l'oggetto data jquery https://api.jquery.com/jquery.ajax/
    Quindi esempio da Jquery Ajax nome=darbula+ (l'invio corretto con percent encoding
    dovrà essere nome=darbula%2B) verrà inviato così com'è nella richiesta POST, php lo recupera con $_POST['nome'] che usa internamente urldecode e quindi darbulacaratterespazio.
    Cos'è il PlainObject?
    Il tipo PlainObject è un oggetto JavaScript contenente zero o più coppie chiave-valore. L'oggetto semplice è, in altre parole, un Object oggetto. È designato come "semplice" nella documentazione di jQuery per distinguerlo da altri tipi di oggetti JavaScript: ad esempio , null array definiti dall'utente e oggetti host come document, che hanno tutti un typeof valore di "oggetto". Il jQuery.isPlainObject() metodo identifica se l'argomento passato è un oggetto semplice o meno, come dimostrato di seguito:
    Codice:
      var a = [];
      var d = document;
      var o = {};
     
      typeof a; // object
      typeof d; // object
      typeof o; // object
     
      jQuery.isPlainObject( a ); // false
      jQuery.isPlainObject( d ); // false
      jQuery.isPlainObject( o ); // true
    Converti in PlainObject, oggetto json
    Codice:
    var nome = $("#nome").val();
    var convobj = '{ nome : "' + nome + '" }';
    //no stringa per l'oggetto data
    // "nome=" + nome
    data: convobj, //altro codice jquery Ajax
    Effettivamente concateno la stringa con il carattere "+" e aggiungo anche il doppio apice, ma poiché sto lavorando con una variabile di tipo stringa nella creazione della variabile $convobj il doppio apice può essere omesso. La semplificazione di ciò
    Codice:
    data: { "nome" : nome },
    Ultima modifica di darbula : 17-10-2021 alle ore 15.58.24

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Quindi stampa (o con var_dump o simili) la stringa che ricevi che passi alla funzione "strpos" e vedi cosa non va o comunque dove sono gli spazi.

    Ciao!

  7. #7
    diegovieni non è connesso Neofita
    Data registrazione
    22-03-2017
    Messaggi
    9

    Predefinito

    Ringrazio ad entrambi per le risposte e per avermi aiutato. Felice di dire HO RISOLTO

    @darbula mi hai "illuminato" sull'uso della codifica in php e jquery. Infatti, oltre ad avermi semplificato il codice jquery, ho preso spunto su ciò che hai detto, ma ho semplificato il tutto utlizzando encodeURIComponent di PHPJS. Il codice uscito fuori è il seguente:

    Codice HTML:
    var nome = $("#nome").val();  	
    var encodedNOME= encodeURIComponent(nome);
    
    /* altro codice */
    
    data: { 
    "nome" : nome,
    },
    ovviamente, grazie anche ad @alemoppo per avermi ricordato l'esistenza di var_dump() () che utilizzavo per ogni prova di codifica per stampare la stringa.

    RISULTATO DI PRIMA: nome+ (scritto) e nomespazio (stampato da var_dump() )
    RISULTATO CON CODIFICA JS: nome+ (scritto) e nome+ (stampato da var_dump() )

    Grazie ad entrambi
    darbula likes this.

  8. #8
    Sigilonline non è connesso Utente giovane
    Data registrazione
    12-04-2009
    Messaggi
    37

    Predefinito

    Giusto perché nessuno lo ha ancora menzionato, usando PHP 8 (che su Altervista è disponibile da qualche mese) dovrebbe potersi risolvere semplicemente con str_contains che è stata aggiunta apposta per semplificare la ricerca delle sottostringhe:

    Codice PHP:
    if (str_contains($str, " "))
    {
    echo
    "La stringa contiene spazi";
    }

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

    Predefinito

    Non è la verifica di una semplice sottostringa
    Codice PHP:
    $str = 'darbula+';
    if (
    str_contains($str, " "))
    {
    echo
    "La stringa contiene spazi";
    }
    Ma come invii i dati, il carattere + in percent encoding significa spazio quando recuperato da $_REQUEST['nome_elemento_form_html'] il + sarà convertito in spazio
    encodeURIComponent (Javascript) spesso invece di convertire lo spazio in + alcune librerie lo convertono con %20 che non è proprio la specifica di una query string ma comunque è valido poiché qualsiasi carattere può essere rappresentato in codifica percentuale.

    Nel dubbio utilizza tale codice che effettua solo il controllo di esistenza che è diverso da un array e dunque stringa con lunghezza superiore a zero nel caso specifico di invio dati con Percent Encoding https://forum.it.altervista.org/php-...ml#post1475711
    Ultima modifica di darbula : 15-11-2021 alle ore 08.06.43

Tags for this Thread

Regole di scrittura

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