Gå til innhold

[løst] regexp hjelp igjen - matche to forskjellige mønstre


Anbefalte innlegg

heisann.

lurer på om noen kan hjelpe meg med en regexp....

jeg har to stk mønstre som jeg vil matche med regexp

 

mønster1:

navn1="verdi" navn2="verdi"

 

mønster2:

navn1 = "verdi" navn2 = "verdi"

 

her har du regexp'n som jeg har til nå:

'/(.*?)=\"(.*?)\"/i'

den tar kun mønster nr1

 

den bør kunne matche begge mønstrene samtidig. altså både mønster1 og mønster2 kan være i strengen jeg søker på ;)

Endret av ThorB
Lenke til kommentar
Videoannonse
Annonse

'/(.*?)(| )=(| )"(.*?)"/i'

 

Denne tar mellomrommet ved å leite etter eit mellomrom eller ingenting etter navn1 og etter =.

 

Merk at du bør skifte ut . med ein tegn klasse for å spesifisere søket litt meir, foreksempel [a-zA-Z0-9] vist du bare tillater bokstaver og tall.

Lenke til kommentar
'/(.*?)(| )=(| )"(.*?)"/i'

 

Denne tar mellomrommet ved å leite etter eit mellomrom eller ingenting etter navn1 og etter =.

 

Merk at du bør skifte ut . med ein tegn klasse for å spesifisere søket litt meir, foreksempel [a-zA-Z0-9] vist du bare tillater bokstaver og tall.

kjempeflott ;) takk skal du ha

testa det nå og alt fungerte akkurat som jeg ville.

Tok også å brukte tegnklasse i [navn], men er litt usikker på jeg skal gjøre det på [verdi] da i verdi kan være javascript tekst (jeg skal parse attributter i html ;) )

 

jeg har også en annen regexp for å matche mot alle html tagger:

regexp = '/<(.*?) (.*?)>/i'

denne må være ganske åpen siden jeg vil fange opp alle tags også de der noen prøver å omgå min tagmatch.

trur den over skal være ganske ok. men hvis det er noen som vet noe lurt som gjør at de omgår regexpn i tagmatchen min, som mest sannsynlig blir inteprettet av nettleser hvis teksten echoes ut(la oss si at hvis taggen blir matchet, blir den erstattet med et mellomrom), så si gjerne i fra.

Endret av ThorB
Lenke til kommentar
jeg har også en annen regexp for å matche mot alle html tagger:

regexp = '/<(.*?) (.*?)>/i'

denne må være ganske åpen siden jeg vil fange opp alle tags også de der noen prøver å omgå min tagmatch.

trur den over skal være ganske ok. men hvis det er noen som vet noe lurt som gjør at de omgår regexpn i tagmatchen min, som mest sannsynlig blir inteprettet av nettleser hvis teksten echoes ut(la oss si at hvis taggen blir matchet, blir den erstattet med et mellomrom), så si gjerne i fra.

Litt usikker akkurat hva du er på jakt etter men jeg kan komme med ett par kommentarer til taggen din så får du bare ignorere hva jeg skriver hvis jeg har misforstått :-)

 

regexp = '/<(.*?) (.*?)>/i' vil ikke matche alle html tagger. Siden du har mellomrom i regex'en din er det mange den ikke vil matche som <div>, </div>, <body>, </a> osv. Den matcher bare de taggene som har flere enn en verdi inni <>. Er dette bevist? Hvis du vil ha med de også kan du bare fjerne mellomromet slik som dette regexp = '/<(.*?)(.*?)>/i'. Du trenger også ikke i til slutt når du bare bruker . siden du ikke definerer case uansett.

 

Som nevnt tidligere kan det være en fordel å ikke benytte seg av . i regex.

regexp = '/<([\/a-z]+)(.*?)>/i'

Denne vil sjekke at taggen starter på vanlige bokstaver eller /. Etter det jeg vet vil vel alle html tagger gjøre dette. I tillegg så krever den at man har en tag name slik at den ikke matcher < > slik din vil gjøre.

 

Jeg la ut min egen regex tester i går kveld som kan hjelpe deg med å teste raskt om regex'ene dine fungerer som du vil. Du finner den på http://regex.larsolavtorvik.com/ . Det er første beta så sikkert fortsatt en del små bugs men tror den kan hjelpe deg med testingen. Bare trykk på versjonsnummeret oppe i høyre hjørne for å kunne raportere bugs :-)

Lenke til kommentar
Litt usikker akkurat hva du er på jakt etter men jeg kan komme med ett par kommentarer til taggen din så får du bare ignorere hva jeg skriver hvis jeg har misforstått :-)

;) setter pris på kommentarene

 

regexp = '/<(.*?) (.*?)>/i' vil ikke matche alle html tagger. Siden du har mellomrom i regex'en din er det mange den ikke vil matche som <div>, </div>, <body>, </a> osv. Den matcher bare de taggene som har flere enn en verdi inni <>. Er dette bevist? Hvis du vil ha med de også kan du bare fjerne mellomromet slik som dette regexp = '/<(.*?)(.*?)>/i'.

det er gjort med vilje da det er kun tagger med attributter som skal begrenses med min kode.

selve taggene begrenser jeg med striptags. så lenge man ikke greier å lure seg unna med en tag med attributter er jeg fornøyd ;)

 

Du trenger også ikke i til slutt når du bare bruker . siden du ikke definerer case uansett.

nei det stemmer. tenkte ikke over dette ;)

 

Som nevnt tidligere kan det være en fordel å ikke benytte seg av . i regex.

regexp = '/<([\/a-z]+)(.*?)>/i'

Denne vil sjekke at taggen starter på vanlige bokstaver eller /. Etter det jeg vet vil vel alle html tagger gjøre dette. I tillegg så krever den at man har en tag name slik at den ikke matcher < > slik din vil gjøre.

hei den logikken virket ikke dum.

det er kanskje ingen tagger som er navngitt i noe annet enn bokstaver i html standard/(og html tagger som ikke er standard). hvis ikke det er noen nettlesere som ikke er strenge på intepreting av tagger. slik at det f.eks går an å skrive < a href="java script:alert('test')">yugyug</a>

men det ser ut som nettleserene er såpass greie at de ikke leser slike tagger.

 

Jeg la ut min egen regex tester i går kveld som kan hjelpe deg med å teste raskt om regex'ene dine fungerer som du vil. Du finner den på http://regex.larsolavtorvik.com/ . Det er første beta så sikkert fortsatt en del små bugs men tror den kan hjelpe deg med testingen. Bare trykk på versjonsnummeret oppe i høyre hjørne for å kunne raportere bugs :-)

den testern der var jo kjempebra da.har testa noen slike før, men din er helt klart den enkleste å bruke.

enter tasten virker som submitter siden, og alle feltene blir blanke etter dette.

 

takk for alle komentaran. det hjelper på

Lenke til kommentar

Bra du likte regex siden min. Bruk den gjerne ofte!

 

Fint regex'en dine begynner å bli slik du vil ha dem.

 

Har du fått svar på de tingene du lurte på slik at du kan markere tråden som løst eller er det fortsatt noe du lurer på? Hjelper gjerne hvis jeg kan :-)

Lenke til kommentar

joda har en liten til

 

<a href="java script:alert('test')" onclick="test()">test</a>

 

hvis jeg vil fjerne java script: fra htmlstrengen, har jeg brukt

regexp

'/java script:/i'

, men så kom jeg å at noen kan fantasifult skrive slik:

 

<a href="javascriptjava script::alert('test')" onclick="test()">test</a>

(ser ut som det kommer en space fra forumet ;) )

som vil resultere i at den ene fjernes, og samtidig danner en ny som ikke fjernes.

hva trur du er beste måten å fjerne den der på?

Endret av ThorB
Lenke til kommentar

Tok å testet litt på http://regex.larsolavtorvik.com/ og denne koden her fjerner begge javascript tekstene.

 

preg_match_all('/java\s?script/i', '<a href="javascriptjava script::alert('test')" onclick="test()">test</a>', $result);

 

Du kan bruke den preg_replace istede på den. Men denne koden fjerner bare selve java script taggene. Alert etc blir stående.

 

Var det noe sånt du tenkte på?

Lenke til kommentar
Tok å testet litt på http://regex.larsolavtorvik.com/ og denne koden her fjerner begge javascript tekstene.

 

preg_match_all('/java\s?script/i', '<a href="javascriptjava script::alert('test')" onclick="test()">test</a>', $result);

 

Du kan bruke den preg_replace istede på den. Men denne koden fjerner bare selve java script taggene. Alert etc blir stående.

 

Var det noe sånt du tenkte på?

 

skjønte ikke helt den regexpn din.

\s = whitespace

n? = Zero og one occurrences of n

så en eller flere mellomrom?

 

Det var forumet som plasserte de mellomrommene i eksempelkoden min. så det ble kanskje litt rart... de skulle altså ikke være der ;)

 

men uansett trur jeg greier meg med den her:

		  while ( strpos( strtolower($returnstr),"java[glem]script:") ) {// ? true:false 
			$regexp  = array();
			$replace = array();
			array_push($regexp ,'/java[glem]script:/i');
			array_push($replace,'');
			$returnstr = preg_replace($regexp, $replace, $returnstr);
	  };

har de arrayene der i tilfelle jeg vil legge inn flere erstatninger på annet

 

at det står igjen en alert gjør ingenting, så lenge ingen javascript blir kjørt...

Endret av ThorB
Lenke til kommentar
Var en eller flere mellomrom som den sjekket ja, så den setningen matchet akkurat det som sto på forumet :-)

Bra du får det til å fungere tilfredstillende i forhold til hva du trengte.

 

Lykke til videre med siden din.

takk for hjelpa.(begge to)

all regexpn her har gått inn i en kode for å gjøre html-posteringer litt mer safe.

det vil si litt bedre kontroll på hva man gir lov til å postere.

 

har allerede hatt god bruk for den regexp hjelpern din(håper du fører videre den keep it simple linja på verktøyet).

du burde sjekke litt rundt støtte for opera nettlesern.

er mye rart som skjer der (av og til fungerer noe og av og til fungerer ingenting...altså ingen regexp blir utført) :p

en annen ting jeg også la merke til.. hvis du har på opsjonen Caseless (i)

og søker på

 

Pattern:

testher\/test\/

 

Replacement:

iyug

 

Subject:

testher/test/

 

i eksemplet over filtreres bort den siste slashen i pattern

for at det over skal bli rett må du skrive:

testher\/test\//

Endret av ThorB
Lenke til kommentar
har allerede hatt god bruk for den regexp hjelpern din(håper du fører videre den keep it simple linja på verktøyet).

du burde sjekke litt rundt støtte for opera nettlesern.

er mye rart som skjer der (av og til fungerer noe og av og til fungerer ingenting...altså ingen regexp blir utført) :p

en annen ting jeg også la merke til.. hvis du har på opsjonen Caseless (i)

og søker på

 

Pattern:

testher\/test\/

 

Replacement:

iyug

 

Subject:

testher/test/

 

i eksemplet over filtreres bort den siste slashen i pattern

for at det over skal bli rett må du skrive:

testher\/test\//

 

Glimrende tilbakemelding.

Jeg hadde introdusert en feil i js koden min i siste versjon når jeg la til Perl regex støtte. Den ble ignorert av Firefox men ikke Opera. Den skal nå være fikset. Ingen ting fungerte som det skulle i Opera med den feilen. Utrolig hvor mye en komma for mye kan ødelegge :-)

 

Har rettet det problemet med submit on enter i opera. Nå skal den aldri submitte, bare benytte seg av AJAX submit.

 

Problemet med det eksempelet ditt var at jeg sjekket om noen hadde / i slutten av pattern og legger bare til en / hvis de ikke har det. Sjekker nå om de ikke har / og ikke er \/ for så og legge til en ekstra /.

 

Jeg har også endret slik at den skal alltid skrive ut regex koden selv om man ikke får noen treff. På den måten ser man lettere om koden faktisk gjøre noe men at man har ugyldig regex.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...