Visualizzazione risultati 1 fino 29 di 29

Discussione: [PHP] Problema Regex

  1. #1
    Guest

    Predefinito [PHP] Problema Regex

    Salve a tutti,
    sto provando a prelevare una parte di codice partendo dalla chiusura dei tags e dal commento... purtroppo l'array continua ad essere vuoto. Sapete aiutarmi?

    Codice PHP:
    preg_match("/<\/script><\/td><\/tr><\/table>\\n(.*)\\n<!-- Ricerca Google -->/",$file,$content);
    Grazie mille! Saluti, Davide! :)

  2. #2
    Guest

    Predefinito

    Faresti un esempio di quello che vorresti ottenere?

  3. #3
    Guest

    Predefinito

    Codice HTML di vario genere... xD
    Codice PHP:
    </script></td></tr></table>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,<br>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,<a href="#">ciaociao</a><br>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
    <!-- Ricerca Google -->

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Codice:
    /<\/script><\/td><\/tr><\/table>\n(.+?)\n<!-- Ricerca Google -->/s
    Il carattere . (punto), nelle regexp, include tutti i caratteri ad eccezione del ritorno a capo.
    Il modificatore s, è fatto apposta per aggiungerlo.

  5. #5
    Guest

    Predefinito

    Così dovrebbe andare...

    Codice PHP:
    preg_match("/(?<=<\/script><\/td><\/tr><\/table>\n)(.|\n)*(?=\n<!-- Ricerca Google -->)/",$file,$content);
    EDIT:

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Codice:
    /<\/script><\/td><\/tr><\/table>\n(.+?)\n<!-- Ricerca Google -->/s
    Il carattere . (punto), nelle regexp, include tutti i caratteri ad eccezione del ritorno a capo.
    Il modificatore s, è fatto apposta per aggiungerlo.
    Così dovrebbe matchare anche i tag <script> ...
    Quelllo sopra dovrebbe matchare solo il "contenuto" ...

    L'ho provato con regex coach e funziona ...
    Ultima modifica di simpleticket : 13-09-2011 alle ore 17.19.13

  6. #6
    Guest

    Predefinito

    Ok, grazie mille! :)
    A questo punto vorrei sapere come fare per far diventare i numeri una lista:
    Codice:
    1 bla bla bla<br>
    2 bla bla xdfasdasd<br>
    3 .....<br>
    ... e così via! Il problema e che è formato da due testi cioè:
    Codice:
    testo<br>
    testo<br>
    testo vario<br>
    con altro testo
    <br><br>
    1 bla bla bla<br>
    2 bla bla xdfasdasd<br>
    3 .....<br>
    Grazie mille in anticipo :)

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Ok, grazie mille! :)
    A questo punto vorrei sapere come fare per far diventare i numeri una lista:
    Codice:
    1 bla bla bla<br>
    2 bla bla xdfasdasd<br>
    3 .....<br>
    ... e così via! Il problema e che è formato da due testi cioè:
    Codice:
    testo<br>
    testo<br>
    testo vario<br>
    con altro testo
    <br><br>
    1 bla bla bla<br>
    2 bla bla xdfasdasd<br>
    3 .....<br>
    Grazie mille in anticipo :)
    Scusami ma non ho capito cosa vuoi fare

  8. #8
    Guest

    Predefinito

    Devo convertire la seconda parte in modo tale da togliere i numeri e metterli in un'altra variabile :)

    Edit: sono riuscito tramite i <br><br> a ottenere le due parti separate, ma non riesco a fare togliere i commenti html prima del br ...
    Codice PHP:
    preg_match_all("/(.+?)<br><br>/s",$content["articolo"][1],$articolo);
    preg_replace("/<!-- (.+?) --><br>/","",$content["articolo"][1][1]);

    $articolo[1][0] = str_replace("<br>","<br />",$articolo[1][0]);
    $articolo[1][1] = str_replace("<br>","<br />",$articolo[1][1]);
    La struttura è:
    array(
    1 => "testo<br>testo<br>testo",
    2 => " <!-- commento --><br >1 bla bla bla<br>2 bla bla bla<br>3 bla bla bla"
    )
    Io dovrei togliere le parti sottolineate con preg_replace/preg_match!
    Grazie mille! :)
    Ultima modifica di sIM : 13-09-2011 alle ore 21.39.37

  9. #9
    Guest

    Predefinito

    Non so se ho capito bene quello che vuoi fare ma se da una stringa tipo

    Codice HTML:
    <!-- commento --><br>1 bla bla bla<br>2 bla bla bla<br>3 bla bla bla
    vuoi ottenere

    Codice HTML:
    <br>bla bla bla<br>bla bla bla<br>bla bla bla
    dovrebbe andare

    Codice PHP:
    $text = "<!-- commento --><br>1 bla bla bla<br>2 bla bla bla<br>3 bla bla bla";
    $pattern = "/(<!--(.)*--><br>[0-9]\s|<br>[0-9]\s)/g";

    $match = preg_replace($pattern, "", $text);
    Ultima modifica di simpleticket : 13-09-2011 alle ore 22.45.10

  10. #10
    Guest

    Predefinito

    Niente da fare! Riguardo su come togliere i numeri qualche idea? :)

  11. #11
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Niente da fare! Riguardo su come togliere i numeri qualche idea? :)
    Ho modificato un po' il mio post precedente. Dimmi se ti funziona ora.

  12. #12
    Guest

    Predefinito

    Dunque, ho sistemato un problema di variabile e ora funziona al 50%.
    Ti spiego, ho diviso in due parti il codice:
    - La prima cancella il commento presente solo nella prima serie di caratteri
    - La seconda elimina i numeri presenti in tutte le righe.

    Il problema e che sto provando a fare qualcosa del genere:
    Codice PHP:
    $articolo[1][1] = preg_replace("/[1-9]{,99} (.+?)<br>/s","$1<br>",$articolo[1][1]);
    Ma niente... nada! Grazie per la tua pazienza! :D

  13. #13
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Dunque, ho sistemato un problema di variabile e ora funziona al 50%.
    Ti spiego, ho diviso in due parti il codice:
    - La prima cancella il commento presente solo nella prima serie di caratteri
    - La seconda elimina i numeri presenti in tutte le righe.

    Il problema e che sto provando a fare qualcosa del genere:
    Codice PHP:
    $articolo[1][1] = preg_replace("/[1-9]{,99} (.+?)<br>/s","$1<br>",$articolo[1][1]);
    Ma niente... nada! Grazie per la tua pazienza! :D
    Numeri con 99 cifre?

  14. #14
    Guest

    Predefinito

    No xD Le cifre sono 2 :) fino a 99...

  15. #15
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    No xD Le cifre sono 2 :) fino a 99...
    se scrivi [0-9]{,99} vuol dire un numero ripetuto da 0 a 99 volte.
    per due cifre basta [0-9]{,2}

  16. #16
    Guest

    Predefinito

    Sì, ma non funziona comunque .-." :)

  17. #17
    Guest

    Predefinito

    questo l'ho testato. Funziona

    Codice PHP:
    $text = "1 bla bla bla<br>2 bla bla bla<br>3 bla bla bla";
    $pattern = "/[0-9]{1,2}\s(.+?)(<br>|$)/s";

    echo
    preg_replace($pattern, "$1<br>", $text);

  18. #18
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Citazione Originalmente inviato da simpleticket Visualizza messaggio
    Così dovrebbe matchare anche i tag <script> ...
    Quelllo sopra dovrebbe matchare solo il "contenuto" ...

    L'ho provato con regex coach e funziona ...
    No, non cattura anche il tag <script> .
    Per quanto mi riguarda, nella tua regexp, utilizzi la lookbehind assertion inutilmente...

    Comunque, per rimuovere i numeri, puoi semplicemente fare così:
    Codice PHP:
    preg_replace("/\d{1,2}/", "", $testo);

  19. #19
    Guest

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    No, non cattura anche il tag <script> .
    Per quanto mi riguarda, nella tua regexp, utilizzi la lookbehind assertion inutilmente...

    Comunque, per rimuovere i numeri, puoi semplicemente fare così:
    Codice PHP:
    preg_replace("/\d{1,2}/", "", $testo);
    Il tuo pattern matcha con tutto il testo, poi se usi replace e sostituisci con $1 si, ottieni solo il tessto "contenuto".
    Il solo match, restituisce tutto il testo, tag compresi.

    Riguardo i numeri, come dici, hai l'effetto collaterale che se nel testo ci sono dei numeri anche questi saranno rimossi, mente a sIM interessa togliere solo i numeri a inizio riga.

  20. #20
    Guest

    Predefinito

    Ragazzi vi ringrazio per la collaborazione... adesso ne ho un altro.. sempre regex..
    Codice PHP:
    preg_match_all("/<td width=\"30%\"><a href=\"\/search.php\?id=(.+)&s={$parola}&md=ff\">(.+)<\/a><\/td>/\n<td width=\"70%\"><small>(.+)<\/small><\/td>/",$file,$c);
    Continua a non funzionare! Cioè, ho unito 2 preg_match_all in uno solo...

    Il codice sarebbe questo:
    Codice PHP:
    <td width="30%"><a href="/search.php?id=NASD148&s=ciao&v=no">titolo</a></td>
    <
    td width="70%"><small>Desc&nbsp;&nbsp; descdesc</small></td>
    E l'array:
    Codice:
    Array (
    [1] =>
       [0] => NASD148,
       [1] => titolo,
       [2] => Desc&nbsp;&nbsp; descdesc
    [2] =>
       [0] => ...
       [1] ....
    Grazie mille :)

  21. #21
    Guest

    Predefinito

    Dovrebbe andare:

    Codice PHP:
    $text = "<td width=\"30%\"><a href=\"/search.php?id=NASD148&s=ciao&v=no\">titolo</a></td>\n";
    $text .= "<td width=\"70%\"><small>Desc&nbsp;&nbsp; descdesc</small></td>";

    $pattern = "/<td width=\"30%\"><a href=\"\/search\.php\?id=(.*?)&s=(.*?)&v=(.*?)\">(.*?)</a><\/td>\n<td width=\"70%\"><small>(.*?)</small></td>/s";

    echo
    preg_replace($pattern, "$1;$4;$5", $text);
    Restituisce

    Codice PHP:
    NASD148;titolo;Desc&nbsp;&nbsp; descdesc

  22. #22
    Guest

    Predefinito

    Non voglio un replace, ma un array da gestire con foreach... così posso personalizzare la lista visto che sono più di uno (ecco perché preg_match_all) xD
    Grazie mille :)

  23. #23
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Non voglio un replace, ma un array da gestire con foreach... così posso personalizzare la lista visto che sono più di uno (ecco perché preg_match_all) xD
    Grazie mille :)
    Quel replace serve per estrarre i dati che ti occorrono e di fatti se vedi quello che restituisce con echo è una stringa di valori separati da punto e virgola (o latro separatore).

    Se vuoi un array basta fare un implode

    Codice PHP:
    $array = implode(";", preg_replace($pattern, "$1;$4;$5", $text));
    print_r($array);

  24. #24
    Guest

    Predefinito

    Sì, ma così prende altro contenuto tramite il tuo preg_replace!
    Non c'è solo quella parte...

  25. #25
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    Sì, ma così prende altro contenuto tramite il tuo preg_replace!
    Non c'è solo quella parte...
    Se tutto il resto segue quello schema, questo

    Codice PHP:
    $text = "<td width=\"30%\"><a href=\"/search.php?id=NASD148&s=ciao&v=no\">titolo</a></td>\n";
    $text .= "<td width=\"70%\"><small>Desc&nbsp;&nbsp; descdesc</small></td>\n";
    $text .= "<td width=\"30%\"><a href=\"/search.php?id=NASD149&s=ciao&v=no\">titolo2</a></td>\n";
    $text .= "<td width=\"70%\"><small>2Desc&nbsp;&nbsp; descdesc2</small></td>";

    $pattern = "/<td width=\"30%\"><a href=\"\/search\.php\?id=(.*?)&s=(.*?)&v=(.*?)\">(.*?)<\/a><\/td>\n<td width=\"70%\"><small>(.*?)<\/small><\/td>/s";

    $array[1] = explode("\n", preg_replace($pattern, "$1|$4|$5", $text));

    for(
    $i = 0; $i < count($array[1]); $i++) {
    $array[1][$i] = explode("|", $array[1][$i]);
    }

    echo
    "<pre>";
    print_r($array[1]);
    echo
    "</pre>";
    avrai quello che cerchi (spero), ovverto tutte le ricorrenze.

    Codice HTML:
    Array
    (
        [0] => Array
            (
                [0] => NASD148
                [1] => titolo
                [2] => Desc   descdesc
            )
    
        [1] => Array
            (
                [0] => NASD149
                [1] => titolo2
                [2] => 2Desc   descdesc2
            )
    
    )
    PS:
    Scusa prima ho scritto implode inceve che explode.

    Ho messo un esempio qui.

  26. #26
    Guest

    Predefinito

    No, poiché prende ogni riga e quindi anche tutta la pagina.
    Dunque mi spiego meglio: se io uso questo codice:
    Codice PHP:
    preg_match_all("/<td width=\"30%\"><a href=\"\/search\.php\?id=(.+)&parola={$parola}\">.+<\/a><\/td>/",$file,$id);
    preg_match_all("/<td width=\"30%\"><a href=\"\/search\.php\?lid=.+&parola={$parola}&md=ff&v=no\">(.+)<\/a><\/td>/",$file,$name);
    preg_match_all("/<td width=\"70%\"><small>(.+)<\/small><\/td>/",$file,$desc);

    ris($id);
    ris($name);
    ris($desc);
    Viene stampato così:
    Codice:
    $id (codice) ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="30%"><a href="/search.php?id=R00EEC00&parola=parolacercata">titolo 1</a></td>
                [1] => <td width="30%"><a href="/search.php?id=F02ERK12&parola=parolacercata">titolo 2</a></td>
            )
    
        [1] => Array
            (
                [0] => R00EEC00
                [1] => F02ERK12
            )
    
    )
    
    $name (titolo) ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="30%"><a href="/search.php?id=R00EEC00&parola=parolacercata">parola 1</a></td>
    
                [1] => <td width="30%"><a href="/search.php?id=F02ERK12&parola=parolacercata">parola 2</a></td>
            )
    
        [1] => Array
            (
                [0] => titolo 1° elemento
                [1] => titolo 2° elemento
            )
    
    )
    
    
    
    $desc ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="70%"><small>desc 1° elemento</small></td>
                [1] => <td width="70%"><small>desc 2° elemento</small></td>
    
            )
    
        [1] => Array
            (
                [0] => desc 1° elemento
                [1] => desc 2° elemento
            )
    
    )
    Quindi in ogni link ci sarà la $parola, cioè la parola cercata + l'id della parola.
    Adesso il mio problema è concatenarli e creare qualcosa tipo:
    Codice:
    Array (
       [1] =>
                  [id] =>  R00EEC00
                  [name] => titolo 1
                  [desc] => descrizione 1° elemento
       [2] =>
                  [id] =>  F02ERK12
                  [name] => titolo 2
                  [desc] => descrizione 2° elemento
    )
    Io ho unito i 2/3 preg_match_all per risparmiare codice, ma vedo che la situazione diventa più complicata. Quindi preferisco lavorare con gli array. C'è una funzione in grado di fare ciò? Poiché ogni array contiene la chiave 0 con lo stile e la chiave 1 senza stile e dentro le chiavi 1 e 0 ci sono i valori (con/senza stile). Io devo prendere solo quelli della chiave 1 e unirli agli altri array :)

    Spero di essermi spiegato... Grazie mille, veramente!

  27. #27
    Guest

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    No, poiché prende ogni riga e quindi anche tutta la pagina.
    Certo, la ricerca viene fatta su tutta la pagina, ma non tutte le righe hanno la struttura impostata nel pattern ...

    Per il resto cerco di guardare con calma quello che hai scritto e vedo se posso aiutarti ...

  28. #28
    Guest

    Predefinito

    Aspetto fiducioso allora :)

  29. #29
    Guest

    Predefinito

    Ti chiedo scusa per il ritardo ma solo oggi, approfittando della domenica ho avuto un minuto per vedere il problema.

    Dunque, partendo da una situazione come quella che descrivi

    Citazione Originalmente inviato da sIM Visualizza messaggio

    Codice:
    $id (codice) ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="30%"><a href="/search.php?id=R00EEC00&parola=parolacercata">titolo 1</a></td>
                [1] => <td width="30%"><a href="/search.php?id=F02ERK12&parola=parolacercata">titolo 2</a></td>
            )
    
        [1] => Array
            (
                [0] => R00EEC00
                [1] => F02ERK12
            )
    
    )
    
    $name (titolo) ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="30%"><a href="/search.php?id=R00EEC00&parola=parolacercata">parola 1</a></td>
    
                [1] => <td width="30%"><a href="/search.php?id=F02ERK12&parola=parolacercata">parola 2</a></td>
            )
    
        [1] => Array
            (
                [0] => titolo 1° elemento
                [1] => titolo 2° elemento
            )
    
    )
    
    
    
    $desc ::
    Array
    (
        [0] => Array
            (
                [0] => <td width="70%"><small>desc 1° elemento</small></td>
                [1] => <td width="70%"><small>desc 2° elemento</small></td>
    
            )
    
        [1] => Array
            (
                [0] => desc 1° elemento
                [1] => desc 2° elemento
            )
    
    )
    Ipotizzando che i tre array hanno lo stesso numero di elementi, quindi

    count($id) = count($name) = count($desc)

    dovresti risolvere con qualcosa come

    Codice PHP:
    for($i = 0; $i < count($id[1]); $i ++) {
    $array[$i][id] = $id[1][$i];
    $array[$i][name] = $name[1][$i];
    $array[$i][desc] = $desc[1][$i];
    }
    Non l'ho provato. fai sapere

Regole di scrittura

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