Newsgroup: it.comp.www.php
Titolo: HELP:  Espressioni regolari con eccezione

Ciao raga,
ho un problema nel realizzare un Espressione regolare con eccezione che
si deve verificare solo in un determinato caso.
Il mio scopo è quello di bloccare tutti gli URL (per fare cerco la
sottostringa http o www) da una stringa contenente dei BBCODE eccetto
per il tag [img]
La reg.ex deve concedere la seguente stringa "
[img]
http://www.xyz.it/ciao.gif[/img]
 "
Ma deve bloccare tutte le altre strighe che contengono " http "
Sono arrivato a questo punto, ma non riesco ad andare avanti:
/(?<!img)http/i
Mi date una mano? Grazie e ciao

per il tag [img]
Ti conviene farlo in tre passaggi: nel primo sostituisci tutti gli URL
con IMG con una sequenza specifica; nel secondo ammazzi tutti gli URL;
e nel terzo ripristini le sequenze rimettendo i tag IMG.
Per esempio il primo passaggio puoi farlo con preg_replace_callback, e
sostituire [img]http://...[/img] con [img]N[/img] (N=0, ...); a mano a
mano che al callback arrivano degli URL, li immagazzina dentro una sua
variabile globale e incrementa un contatore.
A quel punto poi puoi usare il modificatore /e in preg_replace, per il
terzo passaggio, sostituendo '$stk[\\1]' a [[]img[]](\d+)[[]\/img[]].
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

 /(?<!img)http/i
c'eri quasi, invece del lookbehind e' meglio usare il lookahead pero'
/\[(?!img)(.+)\](.+)\[(.+)\]/i
da usare con preg_match_all()

 e nel terzo ripristini le sequenze rimettendo i tag IMG.
un metodo piu' intricato e meno elegante non lo trovi?
capisco ancora ancora in due passaggi: prendere tutti i match, compresi
quelli con [img] e poi ignorare quest'utlimi... ma proprio se non si ha
idea dei lookahead/lookbehind nelle regexp, e non e' il caso di dineco

 GRAZIE MILLE!!!!  Provo e ti faccio sapere
mi spiace dirlo, ma non funziona, le singole stringhe con http non le
trova

 trova
scusa, non avevo capito quello che dovevi catturare, quella al caso tuo
e' questa:
|(?<!\[img])(http://[^\[[[:space:]]+)|i

 |(?<!\[img])(http://[^\[[[:space:]]+)|i
ho riletto ancora meglio il tuo messaggio iniziale:
-(?<!\[img])(http://|www\.)+([^\[[[:space:]]+)-i
questa e' ancora piu' precisa, perche' cattura anche gli url senza
http:// ma che iniziano per www.

T_PAAMAYIM_NEKUDOTAYM ha scritto:

mi spiace dirlo, sopratuto per l'aiuto che mi stai dando, ma questa
regex
continua a predere tutte le strighe che la soddisfano comprese quelle
all'interno nei tag [img] (queste devono essere tralasciate)
è davvero assurdo nonstatne l'operatore di esclusione !
come mai?
cmq sia grazie molte dell'aiuto

 come mai?
evidentemente sbagli qualcosa nel codice che scrivi, prova questo:
<?php
    $str = '
        asdasdasd
        [img]
http://pre.pi
[img]
        asdasdasd
        [b]
http://prasdasde.asdpi
[b]
        sdasdasdasd
 
http://prasdadse.pia
 
www.pasdasd.as
        [img]www.pre.pi[img]
        asdasdadsasdasd
        www.asdasdpi
    ';
    preg_match_all('-(?<!\[img])(http://|www\.)+([^\[[[:space:]]+)-i',
$str, $match);
 
 
    var_dump($match);
?>

un metodo piu' intricato e meno elegante non lo trovi?
Se m'impegno, si' :-) ...il "vantaggio" e' che le regexp da usare sono
estremamente semplici, il debug e' rapido, ed eventuali ampliamenti ad
altri tag o con altre eccezioni _dovrebbero_ essere lineari.
A me - conosco e ammetto i miei limiti - lavorare con i "lookahead" ha
immancabilmente procurato problemi... di solito subito ma spesso anche
quando ritornavo sul codice un due o tre mesi piu' tardi. Lavorare per
piccoli passi successivi lo trovo piu' lento ma piu' sicuro; e d'altra
parte, per chi come me non sa volare... rimane solo lo strisciare!


T_PAAMAYIM_NEKUDOTAYM ha scritto:

Cavolo avevi ragione ho sbagliato a scrivere, scusa :P
GRAZIE MILLE :D

piccola curiosità, e se volessi implementare anche l'esclusione sui
tag che iniziano anche per [img size=111]
?
Dineco ha scritto:


ho provato ad aggiungere "|\[img size.=[0-9]{1,3}]" ma niente dà
errore ç__ç

 tag che iniziano anche per [img size=111] ?
non l'ho provata:
'-(?<!\[img(
size=[0-9]{1,3}){0,1}])(http://|www\.)+([^\[[[:space:]]+)-i'