Newsgroup: it.comp.lang.perl
Titolo: espressioni regolari: Individuare codice php dentro un file

Salve,
premetto che non sono molto esperto di espressioni regolari.
Come faccio a distinguere tramite espressioni regolari
le parti di un file che contengono codice HTML da quelle
che contengono codice PHP delimitato da "<?" e "?>" ?
Ho provato (in linguaggio PHP ma sintassi PERL) con :
<? preg_match_all('/<\?([\s\S(?!\?>)]+)*?\?>/i', $data, $matches); ?>
dove $data contiene il contenuto del file.
Supponendo di avere tre occorrenze di codice PHP dentro al mio file,
il risultato che ottengo è un unico pezzo di codice che inizia con la
prima istruzione del primo blocco PHP e finisce con l'ultima istruzione
più la chiusura del blocco PHP relativa all'ultimo blocco PHP, contenendo
all'interno tutti i blocchi di codice HTML compresi tra il primo e l'ultimo
blocco di codice PHP.
Ringrazio anticipatamente chi vorrà aiutarmi.
-- 
Riccardo


Prendiamo questo file di esempio:
$ cat prova.phtml
<p>
questo è testo
e questo è un <a href="
http://www.falso.com
">hyperlink</a>
</p>
<?
    echo "il codice PHP è qui dentro'"
?>
<ul>
<li>altro HTML</li>
<li>ancora</li>
</ul>
<? print "anche questo è PHP" ?>
<p>di nuovo HTML</p>
Ecco come trovare il codice PHP:
$ perl -0ne 'print "$1\n" while /<\?(.*?)\?>/sg' prova.phtml
    echo "il codice PHP è qui dentro'"
  print "anche questo è PHP"
Attenzione: questo metodo funziona solo se le stringhe "<?" e "?>" NON sono contenute
in un testo.
per esempio, se tu avessi qualcosa come
<? echo "il simbolo '?>' serve per riconoscere il PHP dentro un HTML" ?>
Allora non funzionerebbe, e dovresti usare un modulo (come HTML::Parser).
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

"gmax" <gmax_chiocciola_@_cpan_punto._org> ha scritto nel messaggio 
news:aShWd.621106$b5.28...@news3.tin.it...

Ok, grazie ma...
Il mi problema però è che non devo soltanto isolare i
blocchi PHP, devo anche isolare i blocchi HTML.
Insomma dovrei riuscire a fare un parsing in modo tale
da individuare tutti i blocchi "PHP" e "non PHP" (HTML)
e quindi anche a distinguere blocchi "PHP" da blocchi
"non PHP" (HTML).
-- 
Riccardo

"non PHP" (HTML).
Reinventare la ruota è sempre un'operazione discutibile; reinventare
l'intera automobile è anche molto complicato, oltre che discutibile.
Usa uno dei tanti moduli perl per il parsing di documenti html.
Se per qualche motivo ti è impossibile, non pretendere di risolvere la
cosa con un'espressione regolare. Devi appunto fare un parsing, e
quindi partire da molto più indietro, analizzatore lessicale e così
via.
Ciao.


Ovvio che, in questo caso, una regular expression non fa al caso tuo. Le RegExp sono potenti, ma HTML e' molto piu' 
complesso di quel che sembra. Pertanto, occorre usare un modulo.
Il metodo piu' "facile" e' forse con HTML::TokeParser, per la cui sintassi ti rimando al CPAN.
Ma eccoti un esempio semplice che fa quello che vuoi tu:
use HTML::TokeParser;
use Data::Dumper;
my $p = HTML::TokeParser->new("prova.phtml") or die;
while (my $token = $p->get_token())
{
     print Dumper $token;
}
Il $token ha dei campi che ti dicono se si tratta di inizio tag, testo, o fine tag, e di quale tag si tratta.
Vedi la documentazione del modulo.
http://search.cpan.org/~gaas/HTML-Parser-3.45/lib/HTML/TokeParser.pm
http://www.perlmonks.org/index.pl?node_id=99254
