Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 36
Like Tree4Likes

Discussione: regex e php

  1. #1
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Lightbulb regex e php

    Salve a tutti

    ho un problema con questo codice php che dovrebbe estrarre del testo tramite regex

    sul sito funziona l'estrazione

    https://regex101.com/r/aq3NW2/1

    ma mi trovo in difficolta' qui


    Codice PHP:
    preg_match_all("#href="/out/website[^"]+">(.*?)</a>#"
    Codice PHP:

    ?php

    $haystack2
    = $row->websites;

    preg_match_all("#href="/out/website[^"]+">(.*?)</a>#", $haystack2, $matches2);
    $data2 = $matches2[1];
    $data2 = array_filter(array_unique(array_map('trim', $data2)));
    natsort($data2);
    echo
    '<b>' . join(', ' , $data2 ) . '</b>';
    echo
    "<br>\n";
    echo
    '<font color="blue">' . '<b>' . count( $data2 ) . '</b>' . '</font>' . " web were found.";

    ?>
    Ultima modifica di blackskyisback : 10-08-2021 alle ore 18.58.18

  2. #2
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    4,073

    Predefinito

    Salve,
    ci sono dei problemi con gli apici. Manca quello di chiusura e ci sono solo doppi apici.

    Così è a posto:
    Codice PHP:
    preg_match_all('/#href=\"/out/website[^"]+\">(.*?)</a>#\/', $haystack2, $matches2);
    Cordiali saluti.
    Ultima modifica di GraphOGLRisorse : 11-08-2021 alle ore 13.48.11

  3. #3
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da GraphOGLRisorse Visualizza messaggio
    Salve,
    ci sono dei problemi con gli apici. Manca quello di chiusura e ci sono solo doppi apici.

    Così è a posto:
    Codice PHP:
    preg_match_all('/#href=\"/out/website[^"]+\">(.*?)</a>#\/', $haystack2, $matches2);
    Cordiali saluti.
    sembra che ancora qualcosa non funziona, ricevo moltissimi errori






    Codice PHP:

    $haystack2
    = $row->websites;

    preg_match_all('/#href=\"/out/website[^"]+\">(.*?)</a>#\/', $haystack2, $matches2);
    $data2 = $matches2[1];
    $data2 = array_filter(array_unique(array_map('trim', $data2)));
    natsort($data2);
    echo
    '<b>' . join(', ' , $data2 ) . '</b>';
    echo
    "<br>\n";
    echo
    '<font color="blue">' . '<b>' . count( $data2 ) . '</b>' . '</font>' . " web were found.";

  4. #4
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    4,073

    Predefinito

    Mi scuso, distrattamente avevo per abitutdine messo in apertura e chiusura il / quando c'era già il # che è quvialente.

    Ho corrretto:
    Codice PHP:
    preg_match_all('#href=\"/out/website[^"]+\">(.*?)</a>#', $haystack2, $matches2);
    Cordiali saluti.

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

    Predefinito

    Una stringa php racchiusa da apici singoli, usa il backslash per se stessa o per blackslash.

    Codice PHP:
    preg_match_all('#href="/out/website[^"]+">(.*?)</a>#',$haystack2, $matches2);
    Quello racchiuso tra parentesi tonda è il risultato di $matches2[1]. In sintesi se non vuoi trovare più occorrenze ma semplicemente una. Usa preg_match al posto di preg_match_all.
    Mentre per user avanzato Sequenza escape regex
    Ultima modifica di darbula : 11-08-2021 alle ore 14.59.21

  6. #6
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito



    perfetto, funziona , Grazie GraphOGLRisorse

    riesci a risolvere anche questo? il codice e' simile, solo che utilizza la funzione explode,


    i valori selezionabili sono in <span class = 'descr'> </span>
    le righe sono separate da virgole, ma può succedere che non ci sia


    esempio

    Codice HTML:
    <span class='descr'>test, test2, test3</span>
    Codice HTML:
    <span class='descr'>test</span>
    Codice HTML:
    <span class='descr'>test4 test5</span>
    Codice PHP:

    <?php


    $haystack3
    = $row->websites;

    preg_match("#<span class='descr'>(.*?)</span>#", $haystack3, $matches3);
    $data3 = explode(',', $matches3[1]);
    $data3 = array_filter(array_unique(array_map('trim', $data3)));
    natsort($data3);
    echo
    '<b>' . join(', ' , $data3 ) . '</b>';
    echo
    "<br>\n";
    echo
    '<font color="blue">' . '<b>' . count( $data3 ) . '</b>' . '</font>' . " tags were found.";


    ?>



    il risultato e'
    test
    test 2
    test 3


    mancano test 4 e test 5, penso che il problema risiede in explode, il deliminatore tiene conto della virgola e non dello spazio

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

    Predefinito

    Fai var_dump(urlencode($matches3[1])); non credo la regex va oltre la nuova riga.
    Ultima modifica di darbula : 11-08-2021 alle ore 14.53.50

  8. #8
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Fai var_dump(urlencode($matches3[1])); non credo la regex va oltre la nuova riga.

    ecco il risultato


  9. #9
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    qui funziona, pero' ho dovuto cambiare il deliminatore

    https://regex101.com/r/s9JUHN/1/


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

    Predefinito

    A destra ti indica che stai usando il modificatore, m (pcre_multiline) e g (pcre_global) quest'ultimo non permesso in php (o meglio non è chiaro nella documentazione ma potrebbe essere onnipresente nella funzione preg_match_all). Aggiungi m dopo i delimitatori della tua regex php
    Ultima modifica di darbula : 11-08-2021 alle ore 15.46.47

  11. #11
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Cosi?

    Codice PHP:

    preg_match
    ("#<span class='descr'>(.*?)</span>#m", $haystack3, $matches3);
    perche' se e' cosi non e' cambiato nulla
    Ultima modifica di blackskyisback : 11-08-2021 alle ore 15.49.51

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

    Predefinito

    Prova in questo modo
    Codice PHP:
    preg_match('#^<span class=\'descr\'>(.*?)</span>$#m', $haystack3, $matches3);
    Mostra l'output con var_dump(urlencode($matches3[1]));
    Ultima modifica di darbula : 11-08-2021 alle ore 16.27.27

  13. #13
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Prova in questo modo
    Codice PHP:
    preg_match('#^<span class=\'descr\'>(.*?)</span>$#m', $haystack3, $matches3);
    Mostra l'output con var_dump(urlencode($matches3[1]));
    niente, adesso e' peggiorato


  14. #14
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    mi e' venuta una idea, dato che l'errore e' presente in </span> forse si puo' ovviare facendo terminare il regex con <
    che ne pensi?


  15. #15
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    cosi va sul sito, ma in php adesso come fare?

    / An unescaped delimiter must be escaped with a backslash (\)

    / Un delimitatore senza caratteri di escape deve essere preceduto da una barra rovesciata (\)
    https://regex101.com/r/24kc9I/1/


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

    Predefinito

    Sul sito il testo lo inserisci tu, comunque vedi qui che funziona preg_match_all (preg_match per la prima occorrenza).
    https://3v4l.org/JdIAk
    Probabilmente il testo del tuo database non è racchiuso tra <span class='descr'></span>
    Ultima modifica di darbula : 11-08-2021 alle ore 17.22.09

  17. #17
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    io utilizzo PHP 5.6, il tuo esempio e con il 7,comunque adattando con il tuo codice ricevo errori


    Codice PHP:
    <?php


    $haystack3
    = $row->websites;

    preg_match_all('#^<span class=\'descr\'>(.*?)</span>$#m', $haystack3, $matches3);
    $data3 = explode(',', $matches3[1]);
    $data3 = array_filter(array_unique(array_map('trim', $data3)));
    natsort($data3);
    echo
    '<b>' . join(', ' , $data3 ) . '</b>';
    echo
    "<br>\n";
    echo
    '<font color="blue">' . '<b>' . count( $data3 ) . '</b>' . '</font>' . " tags were found." . '<br>';


    var_dump(urlencode($matches3[1]));

    ?>
    Warning: explode() expects parameter 2 to be string, array given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 202

    Warning: array_map(): Argument #2 should be an array in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 203

    Warning: array_unique() expects parameter 1 to be array, null given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 203

    Warning: array_filter() expects parameter 1 to be array, null given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 203

    Warning: natsort() expects parameter 1 to be array, null given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 204

    Warning: join(): Invalid arguments passed in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 205

    0 tags were found.

    Warning: urlencode() expects parameter 1 to be string, array given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 210
    NULL
    o anche cambiato il parametro 2 su $matches3[1]), niente errori, ma il risultato e' nullo

    ecco la pagina estratta, come vedi il testo e' racchiuso tra <span class='descr'> e </span>

    Codice HTML:
    <li class="mt-1 mt-md-0">
    <a target="_blank" class="websiteLink" rel="nofollow noopener" href="/out/website/6394-network1.com/">web 1</a>
    <a title="website /sets overview" class="internalWebsiteLink" href="/websites/6394/network1.com/">i</a>
    <span> <span class='alias'>Alex</span> <span class='descr'>test, test2, test3</span></span>
    <a class="editLogo" title="edit" id="id8f9" href="#"></a>
    <div id="id905" style="display:none">
    <div id="id906" hidden="" data-wicket-placeholder=""></div>
    </div>
    </li>
    <li class="mt-1 mt-md-0">
    <a target="_blank" class="websiteLink" rel="nofollow noopener" href="/out/website/2488-network2.com/">web 2</a>
    <a title="website /sets overview" class="internalWebsiteLink" href="/websites/2488/network2.com/">i</a>
    <span> <span class='alias'>Alex 2</span> <span class='descr'>test, test2, test3, test4</span></span>
    <a class="editLogo" title="edit" id="id8fa" href="#"></a>
    <div id="id907" style="display:none">
    <div id="id908" hidden="" data-wicket-placeholder=""></div>
    </div>
    </li>
    <li class="mt-1 mt-md-0">
    <a target="_blank" class="websiteLink" rel="nofollow noopener" href="/out/website/2489-network3.com/">web 3</a>
    <a title="website /sets overview" class="internalWebsiteLink" href="/websites/2488/network3.com/">i</a>
    <span> <span class='alias'>Alex 3</span> <span class='descr'>test</span></span>
    <a class="editLogo" title="edit" id="id8fa" href="#"></a>
    <div id="id907" style="display:none">
    <div id="id908" hidden="" data-wicket-placeholder=""></div>
    </div>
    </li>
    </li>
    <li class="mt-1 mt-md-0">
    <a target="_blank" class="websiteLink" rel="nofollow noopener" href="/out/website/2490-network4.com/">web 3</a>
    <a title="website /sets overview" class="internalWebsiteLink" href="/websites/2488/network4.com/">i</a>
    <span> <span class='alias'>Alex 4</span> <span class='descr'>test4 test5</span></span>
    <a class="editLogo" title="edit" id="id8fa" href="#"></a>
    <div id="id907" style="display:none">
    <div id="id908" hidden="" data-wicket-placeholder=""></div>
    </div>
    </li>
    mistero

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

    Predefinito

    Aspetta il codice va modificato, prima $matches3[1] era stringa, mentre con preg_match_all è array.
    Per adesso non ho tempo scusami, più che altro è necessario che trova tutte le occorrenze array $matches3[1] poi si modifica il codice.

  19. #19
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

  20. #20
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    ok darbula, quando hai tempo, naturalmente sono accettate soluzioni da altri guru di questo forum

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

    Predefinito

    Ciao qualcosa di semplice potrebbe essere questo https://3v4l.org/u74H2 ho convertito in stringa.
    Ultima modifica di darbula : 11-08-2021 alle ore 20.12.11

  22. #22
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    stranamente non funziona




    Codice PHP:
    <?php

    $haystack4
    = $row->websites;
    preg_match_all('#^<span class=\'descr\'>(.*?)</span>$#m', $haystack4, $matches4);
    var_dump(implode(',', str_replace(array(', ', ' '), ',', $matches4[1])));

    ?>
    inoltre ci sarebbe il discorso dei duplicati,

    quindi siamo al punto di partenza
    Ultima modifica di blackskyisback : 11-08-2021 alle ore 20.56.52

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

    Predefinito

    Beh programmare significa anche debug del proprio codice, io l'ho tradotto in stringa poi giustamente per i duplicati dovrai usare il resto del codice (cioè $data e il resto, ciò che segue dopo la funzione preg_match) che usavi in precedenza.
    Però il punto in questione è se la regex fallisce, se si perché? Cosa ti stampa var_dump($matches4);
    Ultima modifica di darbula : 11-08-2021 alle ore 21.16.43

  24. #24
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    ecco il risultato

    Ultima modifica di blackskyisback : 11-08-2021 alle ore 21.57.37

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

    Predefinito

    La regex non ottiene corrispondenza, se sono pochi dati fai var_dump(urlencode($haystack4));

  26. #26
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    ecco l'altro risultato con urlencode



    string(0) ""
    string(3436) "%3Cdiv+id%3D%22model-websites-box%22%3E%0D%0A%3Cdiv+id%3D%22id904%22%3E%0D%0A%3C div+class%3D%22box-title%22%3EWebsites%3C%2Fdiv%3E%0D%0A%3Cdiv+class% 3D%22box-body%22%3E%0D%0A%3Cul+style%3D%22margin%3A+0%3B+pa dding%3A+0%3B+list-style-type%3A+none%22%3E%0D%0A%3Cli+class%3D%22mt-1+mt-md-0%22%3E%0D%0A%3Ca+target%3D%22_blank%22+class%3D%2 2websiteLink%22+rel%3D%22nofollow+noopener%22+href %3D%22%2Fout%2Fwebsite%2F6394-network1.com%2F%22%3Eweb+1%3C%2Fa%3E%0D%0A%3Ca+tit le%3D%22website+%2Fsets+overview%22+class%3D%22int ernalWebsiteLink%22+href%3D%22%2Fwebsites%2F6394%2 Fnetwork1.com%2F%22%3Ei%3C%2Fa%3E%0D%0A%3Cspan%3E+ %3Cspan+class%3D%27alias%27%3EAlex%3C%2Fspan%3E+%3 Cspan+class%3D%27descr%27%3Etest%2C+test2%2C+test3 %3C%2Fspan%3E%3C%2Fspan%3E%0D%0A%3Ca+class%3D%22ed itLogo%22+title%3D%22edit%22+id%3D%22id8f9%22+href %3D%22%23%22%3E%26%239998%3B%3C%2Fa%3E%0D%0A%3Cdiv +id%3D%22id905%22+style%3D%22display%3Anone%22%3E% 0D%0A%3Cdiv+id%3D%22id906%22+hidden%3D%22%22+data-wicket-placeholder%3D%22%22%3E%3C%2Fdiv%3E%0D%0A%3C%2Fdiv %3E%0D%0A%3C%2Fli%3E%0D%0A%3Cli+class%3D%22mt-1+mt-md-0%22%3E%0D%0A%3Ca+target

    continua il codice ...............................................
    Ultima modifica di blackskyisback : 11-08-2021 alle ore 22.22.31

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

    Predefinito

    Ok sembra non riconosca il testo se ci sono caratteri attorno il pattern della regex che hai creato.
    crea un file perché la visualizzazione html del tuo browser sta spezzando il codice html.
    error_log(urlencode($haystack4), 3, '/membri/blackskyisback/span_file.txt');
    aggiungendo .* dopo ^ e prima $ dovrebbe comunque riconoscere. Vorrei vedere l'output dal copia incolla del file txt (dovrai usare block notes o altri editor per leggerlo).
    Ultima modifica di darbula : 11-08-2021 alle ore 23.22.57

  28. #28
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Ok sembra non riconosca il testo se ci sono caratteri attorno il pattern della regex che hai creato.
    crea un file perché la visualizzazione html del tuo browser sta spezzando il codice html.
    error_log(ulrencode($haystack4), 3, '/membri/blackskyisback/span_file.txt');
    aggiungendo .* dopo ^ e $ dovrebbe comunque riconoscere. Vorrei vedere l'output dal copia incolla del file txt (dovrai usare block notes o altri editor per leggerlo).
    non penso di aver capito bene

    intendi cosi?

    Codice PHP:

    <?php

    $haystack4
    = $row->websites;
    preg_match_all('#^.*<span class=\'descr\'>(.*?)</span>$.*#m', $haystack4, $matches4);
    var_dump(implode(',', str_replace(array(', ', ' '), ',', $matches4[1])));

    error_log(ulrencode($haystack4), 3, '/members/cinema/span_file.txt');

    ?>

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

    Predefinito

    Codice PHP:
    <?php


    $haystack3
    = $row->websites;

    preg_match_all('#^.*<span class=\'descr\'>(.*?)</span>.*$#m', $haystack3, $matches3);
    $data = implode(',', str_replace(array(', ', ' '), ',', $matches3[1]));
    $data3 = explode(',', $data);
    $data3 = array_filter(array_unique(array_map('trim', $data3)));
    natsort($data3);
    echo
    '<b>' . join(', ' , $data3 ) . '</b>';
    echo
    "<br>\n";
    echo
    '<font color="blue">' . '<b>' . count( $data3 ) . '</b>' . '</font>' . " tags were found." . '<br>';


    var_dump(urlencode($matches3[1]));

    ?>
    blackskyisback likes this.

  30. #30
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    finalmente , sembra che funziona, solo questo errore su var_dump

    Warning: urlencode() expects parameter 1 to be string, array given in E:\OpenServer\domains\cinema\parsing\parsing_view2 .php on line 256




    mi sfugge questo passaggio , prima implode e poi explode

    Codice PHP:
    $data = implode(',', str_replace(array(', ', ' '), ',', $matches3[1]));
    $data3 = explode(',', $data);
    GRAZIE TANTE darbula, sei stato molto gentile (e paziente) ad aiutarmi

    ringrazio anche GraphOGLRisorse

Pagina 1 di 2 12 UltimoUltimo

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
  •