Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema con stringhe contenenti apostrofo

    Ciao. Sto scrivendo degli script php per taggare dei file mp3 reperendo i dati dai siti Wikipedia e Discogs dell’artista dei brani tramite simple_html_dom. I brani sono contenuti in cartelle che hanno come nome il titolo dell’album, nome che viene usato per fare un confronto con i vari titoli album presenti nei due siti: se il confronto dà esito positivo, passo alla pagina dell’album per prelevare i titoli dei brani da usare nei tag.
    Il problema è che quando un album contiene un apostrofo, anche se stampando con echo il nome dell’album da cartella è identico al nome dell’album del sito Discogs, il confronto dà esito negativo (per quanto riguarda Wikipedia non ho problemi di apostrofo ma di caratteri speciali come & o !). Posto parte del codice:
    Codice PHP:
    $discogsUrl=$_POST["discogsUrl"];
    $discogs=file_get_html($discogsUrl);
    foreach(
    $discogs->find('tr[class^="card r_tr"]')as $tr){
    $td=$tr->find('td.title',0);
             
    $a=$td->find('a',0);
             if(
    strtolower($a->plaintext)==$albumDaFolder[$i]){
                       
    $albumDiscogs[$i]=ucwords($a->plaintext);
                       
    $albumUrl[$i]='https://www.discogs.com'.$a->href;
                       
    $albumDom=file_get_html($albumUrl[$i]);
                       break;
             }else{
                       
    $albumDiscogs[$i]='';
                       
    $albumUrl[$i]='';
             }

    Ho provato a usare addshalshes, htmlspecialchars e altre soluzioni creative; il problema è che non so quale è il problema, dato che, come già detto, stampando con echo la stringa è come dovrebbe essere.
    Se qualcuno ha una soluzione gliene sarei eternamente grata.
    Rosa

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Devi normalizzare la stringa.
    1)Inoltro dati (GET o POST) o semplicemente una richiesta http GET, output: "http://www.domain.tld/index.php?chiave1=primo+valore&chiave2=secondo+val ore" usa il percent encoding ove il simbolo del più denota lo spazio interparola.
    2)Se devo inserire tale url in un file HTML (nello specifico elemento a href per altri elementi guarda la specifica del HTML) devo convertire ampersand "http://www.domain.tld/index.php?chiave1=primo+valore&chiave2=secondo +valore" e l'agente utente sa che è &

    $_GET o $_POST usa internamente urldecode, cioè prova var_dump(urldecode('+')); , attenzione in alcune circostanze $_POST potrebbe non essere automaticamente urldecode.

    Per visualizzare il tuo output usa echo urlencode('testo'); così almeno non è limitato se la tua pagina è in html o altro, anche se codice da funzioni interne come urlencode dipendono dal codice interno (per esempio se il sistema operativo è in EBCDIC, potrebbe tradurlo in altro input).
    Ultima modifica di darbula; 29-05-2022 a 11:26

  3. #3
    Ciao. Ti ringrazio molto per la risposta, con il tuo aiuto ho risolto il problema, anche se, sinceramente, non ho capito bene perché ha funzionato, forse sono ancora alle prime armi con php. Comunque l’importante è che ho risolto.
    Ora ti chiedo, cosa devo fare per il titolo dell’album contenente i simboli “!“ e “&”? Usando lo stesso sistema non funziona, in questo caso anche quando il confronto lo faccio tra il titolo da cartella e il titolo album della pagina Wikipedia.
    Forse sto abusando della tua disponibilità, ma dato che sei stato così gentile e così bravo, io ci ho provato.
    Grazie ancora e ciao,
    Rosa

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Correzione del mio commento precedente
    https://www.w3.org/TR/html401/append...on-ascii-chars

    Input prima del modulo html: chiave1=primo valore&chiave2=secondo valore

    Output dopo l'inoltro del modulo html: chiave1=primo+valore&chiave2=secondo+valore

    Recupero tramite $_GET o $_POST automaticamente (significa senza aggiungere urldecode al proprio script php) con urldecode: chiave1=primo valore&chiave2=secondo valore

    Modifica %URI per href
    codice HTML:
    <a href="http://www.domain.tld/index.php?chiave1=primo+valore&amp;chiave2=secondo+valore"/>
    o invece di percent encoding il carattere spazio trasformato in più è %20 rawurlencode, solitamente nella query string o l'inoltro dei dati è raccomandato percent encoding mentre per il percorso di cartelle si usa rawurlencode cioè %hh
    Nei browser non di vecchia data anche la sintassi senza entità carattere &amp; è supportata (comunque è il browser che è benevolo ma illegale
    codice HTML:
    <a href="http://www.domain.tld/index.php?chiave1=primo+valore&chiave2=secondo+valore">
    )
    Ultima modifica di darbula; 29-05-2022 a 21:40

  5. #5
    Rettifico, non è vero che ho risolto il problema, mi sembrava così perché viene preso il primo album della lista di Discogs e il primo album era proprio quello che cercavo di ottenere. Cambiando artista, semplicemente ottengo, appunto, il primo album della lista, quindi sono punto daccapo.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Puoi gentilmente fornire
    Codice PHP:
    <?php
    $discogsUrl
    =$_POST["discogsUrl"];
    $perdarbula =urlencode($discogsUrl);
    //il resto del tuo codice
    var_dump($perdarbulaurlencode($albumDaFolder[$i]));
    Ultima modifica di darbula; 29-05-2022 a 21:45

  7. #7
    Scusa se non ti ho risposto prima, l’altro ieri ero stanca e sono andata a dormire, ieri, invece, ho avuto da fare tutto il giorno.
    Non ho fatto quello che mi hai chiesto perché il problema non è (anzi era, perché ho risolto) nell’URL, ma nei due membri dell’uguaglianza: $a->plaintext e $albumDaFolder.
    Ho risolto stampando i caratteri di $a->plaintext uno per uno, in questo modo:
    Codice PHP:
    for($y=0;$y<=strlen($a->plaintext)-1;$y++){
           
    $char=substr($a->plaintext,$y,1);
           echo 
    $char;

    Così mi sono resa conto che al posto dell’apostrofo, in $a->plaintext, c’era "&#39;". A questo punto mi è bastato uno str_replace:
    codice:
    if(str_replace("&#39;","'",strtolower($a>plaintext))==$albumDaFolder[$i]{
    Mi dispiace che il tuo intervento non abbia portato a una soluzione, ti ringrazio comunque tanto per l’interessamento. Ciao.
    Rosa

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.