Visualizzazione risultati 1 fino 3 di 3

Discussione: RegEx Trovare testo ma solo se non contenuto in altro

  1. #1
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito RegEx Trovare testo ma solo se non contenuto in altro

    Buongiorno forum

    vengo subito al dunque.
    In un testo (che contiene tag html) mi servirebbe trovare tramite regex un particolare elemento ma solamente se NON incluso in altri elementi.

    Ad esempio (moooooolto semplificato), nel testo:
    Codice:
    La <b>casa</b> di carta.
    Il <span><b>trono</b></span> di spade.
    e mi serve recuperare le parti in grasetto, dovrei recuperare <b>casa</b> ma non <b>trono</b> poichè contenuto in un altro tag (span).

    Come posso impostare il pattern di ricerca (da utilizzare poi in altro replace) per ottenere questo risultato?

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

    Predefinito

    Io farei in questo modo

    Codice PHP:
    <?php

    $testo
    = 'La <b>casa</b> di carta.
    Il <span><b>trono</b></span> di spade.
    Ciao <b>io testo</b> a'
    ;

    $pattern = '/[^<]*(<b>[^<]+<\/b>)[^<]*<?[^<]*(?:<b>)?[^<]*(?:<\/b>)?.*[^<]*/';
    preg_match_all($pattern, $testo, $occorrenze);
    if(isset(
    $occorrenze[1])) {
    foreach(
    $occorrenze[1] as $key => $value) {
    echo
    $occorrenze[1][$key], "\n";
    }
    }
    ?>

  3. #3
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Citazione Originalmente inviato da phollia Visualizza messaggio
    In un testo (che contiene tag html) mi servirebbe trovare tramite regex un particolare elemento ma solamente se NON incluso in altri elementi.
    HTML ed espressioni regolari? C'è una risposta :D Il modo corretto per trovare quei tag sarebbe usare un parser HTML come la classe DomDocument.

    Se invece ti accontenti di un requisito più "stupido", allora potresti implementarlo come "trovare i tag <b> che non sono preceduti da '>' o seguiti da '<'."

    Simile alla regex di Darbula, ma usando assertion:

    Codice PHP:
    # (?<! .... ) negative look-behind
    # (?! .... ) negative look-ahead
    # .*? not-greedy
    $pattern = "#(?<!>)<b>(?P<contenuto>.*?)</b>(?!<)#"
    Ma qualsiasi espressione regolare sarà comunque solo un'approssimazione, perché l'HTML è un linguaggio più complesso di quello che le espressioni regolari sono in grado di rappresentare.
    Ultima modifica di dreadnaut : 09-06-2022 alle ore 21.45.46

Regole di scrittura

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