Newsgroup: it.comp.www.php
Titolo: Problemi con regexp..

Ciao a tutti,
Domanda un po' da niewbee:
volevo usare questo pattern:
$r = "%<td valign=top><a href=\"([^>]+?)\"(.*?)>%";
Per distinguere in un file HTML la stringa:
"<td valign=top><a href...."
dalla stringa
"<td width=80 align=top valign=top><a href...."
Deve esserci un match nel primo caso, e non deve dare risultati nel
secondo.
Ma invece non torna nulla. E se uso solo:
$r = "%<a href=\"([^>]+?)\"(.*?)>%";
mi torna entrambe le stringe, chiaramente.
Ok, lo so sto facendo qualche errore colossare, regedit non lo conosco
molto bene.
C'e' qualche anima pia che mi aiuti a trovare il giusto pattern per il
problema qui esposto, pleaseee?
Grazie.
Fabian

 Per distinguere in un file HTML la stringa:
Posta l'HTML reale.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.


Questo e' uno spezzone di HTML:
"<td width=80 align=center valign=top><a href="<link that should not be
grabbed by the pattern>" id=1000><img src=image.jpg width=66 height=79
alt="" border=1><br><font size=-2>Bla Bla text</font></a></td><td
valign=top><a href="<link that should be grabbed by the pattern>"
id=2000>Bla bla text</a><br>"
Il testo spiega anche (in inglese).
Ciao
Fabian

Fabian ha scritto:
 > Questo e' uno spezzone di HTML:
 > "<td width=80 align=center valign=top><a href="<link that should not be
 > grabbed by the pattern>" id=1000><img src=image.jpg width=66 height=79
 > alt="" border=1><br><font size=-2>Bla Bla text</font></a></td><td
 > valign=top><a href="<link that should be grabbed by the pattern>"
 > id=2000>Bla bla text</a><br>"
lasciando perdere le regexp (nn ci capisco un granchč), volevo solo 
dirti che l'html generato dal tuo codice č fuori standard. in 
particolare i valori degli attributi dei tag vanno racchiusi tra doppi 
apici, quindi width="80"
fai cosě dunque
echo "<td width=\"80\" align=\"center\">";
eccetera. ovviamente il backslash non viene stampato...

 eccetera. ovviamente il backslash non viene stampato...
Lo so che e' fuori standard, ma non lo scrivo io per cui non lo posso
modificare. Volevo solo leggerlo e grabbare le parti che mi interessano
ma non ci riesco!
Conosci qualcuno che mi puo' aiutare perche' sono proprio bloccato.
Ciao,
Fabian

 Conosci qualcuno che mi puo' aiutare perche' sono proprio bloccato.
mi dispiace ma no. Posso solo consigliarti un buon libro che m'ero 
ripromesso di leggere ma che giace da qualche parte tra i miei bytes 
causa mancanza di tempo.
Si tratta di:
Mastering Regular Expressions
di: Jeffrey E.F. Friedl
edito da O'Reilly
sicuro che non ci sia un mezzo più semplice (magari meno efficiente) 
delle espressioni regolari?
Ciao

 grabbed by the pattern>" id=2000>Bla bla text</a><br>"
<?php 
$content = 'html content';
$pattern = '/<td valign=top><a href="(.*?)"/si';
if (preg_match_all ($pattern, $content, $matches)) {
	print_r ($matches);
}
?>


 apici, quindi width="80"
[..]
veramente dovrebbe dire che i valori degli attributi devono essere racchiusi
tra apici singoli o doppi con l'unico obbligo di non usarli tutti e due
nella dichiarazione di un singolo attributo o di usare l'apice delimitatore
scelto nell'attributo stesso..
ie.
<tag valido_0='valore zero' valido_1="valore uno" valido_2="valore 'due'"
nonValido_0="valore tre' nonValido_1="valore "quattro"" />
-- 
www.iuz-lab.info

id=2000>Bla bla text</a><br>"
/<td valign=([\"']*)top\\1><a href=([\"']*)([^\\2]+)\\2 id/U
Ho provato con:
<?
        $html = <<<HTML
<td width=80 align=center valign=top><a href="<link that should not be
grabbed by the pattern>" id=1000><img src=image.jpg width=66 height=79
alt="" border=1><br><font size=-2>Bla Bla text</font></a></td><td
valign=top><a href="<link that should be grabbed by the pattern>"
id=2000>Bla bla text</a><br>
HTML;
        $r = "/<td valign=([\"']*)top\\1><a href=([\"']*)([^\\2]+)\\2
id/U";
        preg_match($r, $html, $gregs);
        print "Ho trovato $gregs[3]\n";
?>
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

 scelto nell'attributo stesso..
Io non mi riferivo alla sintassi corretta del PHP, ma alla qualità del 
codice HTML di output. Insomma, quello che viene interpretato dal 
browser, e per quanto mi risulta lo standard prevede il doppi oapice " e 
non il singolo. Che poi non succeda nulla con apice singolo o senza 
apici questo è un altro conto, ma del resto ci sono dei browser in giro 
che gli standard non sanno nemmeno cosa siano (vedi comportamenti 
assurdi di ie con i div)
Ciao

 Ciao
la correttezza e qualita' del codice HTML non e' compromessa come lo
standard definisce..
[quoting
http://www.w3.org/TR/1999/REC-html401-19991224/intro/sgmltut.html#h-3.2.2
]
On SGML and HTML
[..]
By default, SGML requires that all attribute values be delimited using
either double quotation marks (ASCII decimal 34) or single quotation marks
(ASCII decimal 39). Single quote marks can be included within the attribute
value when the value is delimited by double quote marks, and vice versa.
[/quoting
http://www.w3.org/TR/1999/REC-html401-19991224/intro/sgmltut.html#h-3.2.2
]
-- 
www.iuz-lab.info

Grazie.
Il tuo codice ha funzionato. Ora pero' non so cosa stavo facendo di
sbagliato nel senso che non sono piu' riuscita a riprodurre il problema
originale.
Comunque poco importa: ora va tutto.
Grazie infinite.
Fabian
