PDA

View Full Version : [REGEX]Matchare parole solo se non sono dentro a un tag html


ilDave
13-03-2008, 10:46
Salve :)
Ho una regular expression che matcha parole singole in un testo, così:

"/(\bparola\b)/"

Ora però devo modificarla: mi serve che se "parola" è all'interno di un tag html non venga matchata: per esempio, se il testo è
<img src="parola.jpg" />
la stringa "parola" non deve essere matchata.

Come posso fare?
Grazie.

kk3z
13-03-2008, 11:21
Secondo me fai prima con le funzioni del DOM prendendo tutti i nodi senza tag

ilDave
13-03-2008, 11:23
Non posso, devo farlo in php, sono dei testi che devono essere manipolati prima di essere salvati su db.

kk3z
13-03-2008, 14:08
Il php ha delle estensioni per il dom, se hai il php5 dovrebbe essere integrata l'estensione dom, altrimenti cerca l'estensione domxml. Se non puoi installare estensioni, cerca un parser xml o html..

m.distrutti
13-03-2008, 14:43
non so esattamente l'algoritmo che vuoi applicare

cmq credo che questo formato : <(.*?)parola(.*?)>
si adatti ad un tag con la parola : parola al suo interno

se invece volessi negare parola credo sia questo : <(.*?)^[parola](.*?)> dove il simbolo ^ afferma il fatto che non debba esserci la parola all'interno delle quadre,se fosse stato messo [^parola] si sarebbe riferito ai caratteri p a r o l a (chiedo a chi e' piu competente di correggermi se dovessi dire qualche idiozia ihih)

una buona guda sulle regular expression la trovi nel sito http://it2.php.net/manual/it/reference.pcre.pattern.syntax.php

nell'esempio precedente il primo (.*?) rappresenterebbe img src=" mentre il secondo " />

cosi facendo pero non ti assicura un tag ben formato

spero di esserti stato di aiuto :P

kk3z
13-03-2008, 16:28
<(.*?)^[parola](.*?)>

Non funzionerebbe. Primo perchè cercherebbe un carattere solo tra p,a,r,o,l,a. Secondo perchè ^ funziona o all'inizio dell'espressione regolare, o dentro una classe di caratteri (dentro []).

kk3z
15-03-2008, 09:03
Potresti anche usare strip_tags, quindi usare le espressioni regolari.

m.distrutti
15-03-2008, 09:28
da php.net

Ad esempio, la classe [aeiou] identifica ogni vocale minuscola, mentre [^aeiou]
identifica tutti i caratteri che non siano delle vocali
minuscole. Occorre notare che il simbolo "^" è un modo pratico per indicare i caratteri che
sono nella classe, citando quelli che non
lo sono. Questa non è una asserzione: consuma un carattere della stringa oggetto di
ricerca e fallisce se ci si trova alla fine del
testo.


^[parola] per escludere i caratteri il simbolo dovrebbe essere tenuto dentro le parentesi []:S,
cmq adesso provo in java le regex

m.distrutti
15-03-2008, 11:02
nu vabbe stava venendo una cosa troppo contorta con le regex mo non ho tempo per sbattere la testa pure su sta cosa >_>, in effetti hai ragione non e' la strada piu elegante mi sa :)

cmq si me le sono ripassate prima e ho fatto una gaf XD

gugoXX
15-03-2008, 11:08
Una Regex per detaggare, la tua a seguire per cercare.

Questa dovrebbe detaggare

string tagged=".....";
Regex regex = new Regex("<[^>]+>");
string detagged = regex.Replace(tagged, "");

kk3z
15-03-2008, 13:06
Una Regex per detaggare, la tua a seguire per cercare.

Questa dovrebbe detaggare
strip_tags (http://www.php.net/strip_tags) funziona benissimo :)