Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Preg_macth

  1. #1

    Preg_macth

    Ciao a tutti.

    Ho un piccolo errore di parsing di un testo.

    In pratica devo estrapolare da un testo html, tutti i tag ed il loro contenuto, che abbiamo un predefinito attributo.

    codice:
    <p class="prova">Questo è il paragrafo da estraplare.</p>
    
    <p class="esempio">Questo non va estrapolato</p>
    
    <ul class="prova">[*]Anche queste[*]linee vengo estrapolate[/list]
    <?php
    preg_match_all('#<\[[A-Z]\] class="prova">(.*?)</\[[A-Z]\]>#', $corpo,  $tags);
    ?>
    Con questo codice mi rende degli array vuoti.

    Cosa devo cambiare?

  2. #2
    La cosa non e' cosi' semplice. Intanto il primo errore e' che le quadre non vanno precedute da un backslash, altrimenti perdono il loro significato di metacarattere e indicano una semplice quadra cosi' com'e'. Poi il tuo pattern cerca solo tag di un singolo carattere maiuscolo. Inoltre bisogna usare il backreferencing per accoppiare il tag di apertura con il suo "gemello" di chiusura.

    Questo codice funziona con il tuo testo di esempio:
    Codice PHP:
    $testo '<p class="prova">Questo è il paragrafo da estraplare.</p>

    <p class="esempio">Questo non va estrapolato</p>

    <ul class="prova">[*]Anche queste[*]linee vengo estrapolate[/list]'
    ;

    preg_match_all("#<([a-z]+) class=\"prova\">(.*)<(/\\\\1)>#isU"$testo$result);

    print_r($result); 
    E' una versione migliorabile (e non garantisco che funzioni sempre ).
    Ad esempio quel pattern non trova:
    - tag con i numeri come <h1 class="prova"> (basta cambiare [a-z] in [a-z0-9], o anche [a-z1-6] se gli h sono gli unici tag con un numero (la mia memoria e' quello che e' non ne sono sicuro ))
    - tag con altri attributi come <p class="prova" id="paragrafo1">
    - tag formattati in maniera leggermente diversa, ad esempio con 2 o piu' spazi tra il nome e "class", o con uno o piu' spazi prima del ">" di chiusura tag

    Il concetto pero' e' quello.

    Fondamentali sono i flag "isU" alla fine del pattern:
    - i significa case-insensitive
    - s significa che il punto "matcha" anche il carattere di newline, quindi permette i match multiriga
    - U significa "ungreedy" cioe' dice di "matchare" il meno possibile, mentre il comportamento di default delle regexp e' "avido". Senza quel flag il tag gemello del primo <p e' il </p> che si trova alla fine di "Questo non va estrapolato", proprio perche' il pattern cerca di "prendere" quanto piu' possibile.

    Spero di essermi spiegato abbastanza bene, le regexp sono un argomento molto vasto e difficile da condensare in poche righe

  3. #3

    Re: Preg_macth

    Originariamente inviato da Kreatore
    Ciao a tutti.

    Ho un piccolo errore di parsing di un testo.

    In pratica devo estrapolare da un testo html, tutti i tag ed il loro contenuto, che abbiamo un predefinito attributo.

    codice:
    <p class="prova">Questo è il paragrafo da estraplare.</p>
    
    <p class="esempio">Questo non va estrapolato</p>
    
    <ul class="prova">[*]Anche queste[*]linee vengo estrapolate[/list]
    <?php
    preg_match_all('#<\[[A-Z]\] class="prova">(.*?)</\[[A-Z]\]>#', $corpo,  $tags);
    ?>
    Con questo codice mi rende degli array vuoti.

    Cosa devo cambiare?
    Ciao
    ti sei fatto le domande base? Tipo:
    - in $corpo cosa c'è? non è che magari è vuoto?
    - in $tags cosa hai messo?
    - non è che magari che la stringa cone le espressioni regolari deve stare fra " (virgolette) e non ' (apici)?

    fatti le domande e passa le risposte... magari non avrai neppure bisogno di noi!

  4. #4
    Intanto grazie. Ci stavo provando andando a leggere le varie guide ed ero arrivato al [a-zA-Z0-6]+ ma non alle parentesi tonde.

    Originariamente inviato da k.b
    Codice PHP:
    preg_match_all("#<([a-z]+) class=\"prova\">(.*)<(/\\\\1)>#isU"$testo$result); 
    E' una versione migliorabile (e non garantisco che funzioni sempre ).
    Ad esempio quel pattern non trova:
    - tag con i numeri come <h1 class="prova"> (basta cambiare [a-z] in [a-z0-9], o anche [a-z1-6] se gli h sono gli unici tag con un numero (la mia memoria e' quello che e' non ne sono sicuro ))
    Problema risolto... appunto.
    - tag con altri attributi come <p class="prova" id="paragrafo1">
    sto pensando a come risolverli
    - tag formattati in maniera leggermente diversa, ad esempio con 2 o piu' spazi tra il nome e "class", o con uno o piu' spazi prima del ">" di chiusura tag
    non possono esserci, perche il testo viene generato da uno script.

    Fondamentali sono i flag "isU" alla fine del pattern:
    - i significa case-insensitive
    - s significa che il punto "matcha" anche il carattere di newline, quindi permette i match multiriga
    - U significa "ungreedy" cioe' dice di "matchare" il meno possibile, mentre il comportamento di default delle regexp e' "avido". Senza quel flag il tag gemello del primo <p e' il </p> che si trova alla fine di "Questo non va estrapolato", proprio perche' il pattern cerca di "prendere" quanto piu' possibile.

    Spero di essermi spiegato abbastanza bene, le regexp sono un argomento molto vasto e difficile da condensare in poche righe
    Per il momento cosi funziona.

    Devo capire ora il backreferencing per, ad esempio le liste..

  5. #5
    Originariamente inviato da Kreatore
    - tag con altri attributi come <p class="prova" id="paragrafo1">
    sto pensando a come risolverli
    Mah
    Codice PHP:
    preg_match_all("#<([a-z1-6]+) .*class=\"prova\".*>(.*)<(/\\1)>#isU"$testo$result); 
    dovrebbe funzionare. Poi dipende se vuoi anche fare un minimo di controllo sulla validita' dei tag, nel qual caso [a-z1-6] permette un po' piu' del dovuto. Ma se dici che il testo e' generato magari non e' necessario fare qualcosa come ([a-z]+|h[1-6]).

    Devo capire ora il backreferencing per, ad esempio le liste..
    Cioe'?

  6. #6
    no, questo fa selezionare tutto.

    Cioe'?
    Cioè che se ho un paragrafo tipo



    PAlla al piede di traverso</p>

    Lo script mi prende solo fino a [/b] e non oltre

  7. #7
    Originariamente inviato da Kreatore
    no, questo fa selezionare tutto.



    Cioè che se ho un paragrafo tipo



    PAlla al piede di traverso</p>

    Lo script mi prende solo fino a [/b] e non oltre
    Mah a me
    Codice PHP:
    preg_match_all("#<([a-z1-6]+) .*class=\"prova\".*>(.*)<(/\\\\1)>#isU"$testo$result); 
    funziona su tutti gli esempi che hai fatto.

    Testato ora su questo testo:
    Codice PHP:
    $testo '<p class="prova" id="id" attibutox="y">Questo è il paragrafo da estraplare.</p>

    <div style="blabla" class="prova">testo [b]di prova[/b] con bold</div>

    <h5 style="blabla" class="prova">testo [i]di prova[/i] con italic</h5>

    <p class="esempio">Questo non va estrapolato</p>

    <ul class="prova">[*]Anche queste[*]linee vengo estrapolate[/list]'


  8. #8
    Edit: scusa questo forum si mangia i backslash. Ho corretto l'ultimo post, dovrebbe sempre essere \\1 con due backslash.

  9. #9

  10. #10
    Se sei su php5 puoi utilizzare le Dom
    functions.
    Una cosa del genere per intenderci:

    Codice PHP:
    $doc = new DOMDocument();
    $html'<p class="prova" id="id" attibutox="y">Questo è il paragrafo da estraplare.</p> 
            <div style="blabla" class="prova">testo [b]di prova[/b] con bold</div> 
            <h5 style="blabla" class="prova">testo [i]di prova[/i] con italic</h5> 
            <p class="esempio">Questo non va estrapolato</p>'
    ;
    $doc->loadHTML($html);
    $tags$doc->getElementsByTagName('*'); 
    foreach(
    $tags as $tag){
        if(
    $tag->getAttribute('class')=='prova'){
            echo 
    $tag->firstChild->nodeValue;
        }
    }
    //echo $doc->saveHTML(); 

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

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.