Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: regular expression

  1. #1

    regular expression

    Buongiorno,
    in una variabile stringa: $stringa, ho il codice HTML di una pagina web.

    all'interno del codice c'è un tag img con un id univoco: myimg

    [img]immagini-y/immagine-x.jpg[/img]

    ho la necessità di assegnare, ad una variabile php, la source (immagini-y/immagine-x.jpg) del tag image identificato da id="myimg".

    Come sarà l'espressione regolare che identifica il mio src?

    E quale funzione di PHP bisogna usare per estrapolarlo da $stringa?

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    if(preg_match('/[img](.*?)[/img]/si',$stringa,$m)){
    echo $m[1];
    }

  3. #3
    grazie bubi1,
    potrò testarlo solo domani, ti farò sapere.

  4. #4
    invece di trovare
    [img]folderx/folder-y/img-z.jpg[/img]

    trova
    [img]../images/load.gif[/img]

    :master:

  5. #5
    La regexp di bubi1 non va bene perche' e' vero che il ? rende i quantifier non-greedy, ma e' anche vero che le regexp matchano sempre prima da sinistra, quindi avendo questa stringa:
    codice:
    [img]../images/load.gif[/img][img]folderx/folder-y/img-z.jpg[/img]
    il pattern matcha perche' trova l'id corretto, pero' prende il primo src che trova (cioe' quello della prima immagine).

    Io farei cosi': prima estraggo tutte le immagini, poi filtro quelle con l'id corretto e infine da queste ultime estraggo l'src
    codice:
    $stringa = '
    [img]../images/load.gif[/img]
    [img]folderx/folder-y/img-z.jpg[/img]
    [img]folderx/folder-XXX/img-z.jpg[/img]
    [img]../images/load.gif[/img]
    [img]folderx/folder-YYY/img-z.jpg[/img]
    ';
    
    preg_match_all('#<img.*?>#', $stringa, $images);
    
    foreach (preg_grep('/id="orderimg"/', $images[0]) as $match) {
    	preg_match('/src="(.*?)"/', $match, $src);
    	echo $src[1], "\n";
    }
    Comunquee usare le regexp per lavorare sull'HTML e' sempre abbastanza "tricky". Va bene finche' sei sicuro di come e' fatto il testo in input, altrimenti se devi considerare OGNI possibile porcheria diventa necessario usare un vero parser. Ad esempio, basta aggiungere un title="foo>bar" nel posto sbagliato e il primo pattern puo' fallire.

  6. #6
    e come estraggo tutte le immagini?

  7. #7
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    gia', non ci avevo pensato

    vabbe', basta fare

    if(preg_match('/<img[^>]*?src="([^>]*?)"[^>]*?id="orderimg"[^>]*?\/>/si',$stringa,$m)){
    echo $m[1];
    }

    ovviamente giustissimo il raggionamento sull'input che ha fatto k.b.

  8. #8
    Originariamente inviato da lucavizzi
    e come estraggo tutte le immagini?
    Il codice che ho postato fa tutte le cose che riassumevo prima.

  9. #9
    Originariamente inviato da bubi1
    gia', non ci avevo pensato

    vabbe', basta fare

    if(preg_match('/<img[^>]*?src="([^>]*?)"[^>]*?id="orderimg"[^>]*?\/>/si',$stringa,$m)){
    echo $m[1];
    }
    Non ho testato questo pattern ma dando per buono che funziona, mi sembra che si sfori nel "complicato oltre il necessario". Credo che quello che piu' spaventi la gente delle regular expression (e cio' che crea piu' problemi nel debug) e' cercare di risolvere un problema con una singola regular expression. Da nessuna parte e' scritto che non si possa scomporre il problema in parti (spesso molto) piu' semplici ed usare pattern molto piu' immediati da scrivere e comprensibili da leggere.

    Spesso la scomposizione garantisce anche maggior flessibilita': in questo caso ad esempio, il pattern unico che suggerisci fallisce se per caso vengono invertiti gli attributi id e src, con il mio approccio invece anche invertendoli si ottiene lo stesso il risultato voluto.

  10. #10
    Originariamente inviato da k.b
    Il codice che ho postato fa tutte le cose che riassumevo prima.
    non mi ero accorto...
    lo testo domattina, ti farò sapere.
    Grazie intanto

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 © 2024 vBulletin Solutions, Inc. All rights reserved.