[php|regex] woorden niet matchen

Pagina: 1
Acties:
  • 219 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil een string matchen waar een bepaald woord niet in voorkomt. Nu weet ik dat je woorden kunt matchen met \b maar ik heb nog nergens gezien hoe je bepaalde woorden kunt uitsluiten.

Als voorbeeld een string: tot aan woord moet het matchen.
Als ik nu alle tekens tot aan woord wil matchen zou ik denken, gebruik zoiets als dit:
code:
1
[.]*[^\bwoord\b]
Nu zou alleen tot aan moet matchen.

Het vreemde is dat ik al een tijdje aan het zoeken ben naar een woord niet matchen alleen ik vind alleen maar hits met pagina's waar ze juist wel matchen...

Iemand een oplossing voor dit probleem?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Je wilt iets matchen waar het niet in zit, maar vervolgens wil je wel dat item vinden. Waarom kun je niet iets doen als:

"^(.*)woord"

Dan staat je "tot aan" gewoon in je eerste element.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee ik wil dus tot aan matchen, en niet woord.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

het is niet mogelijk om met regular expressions een heel woord eruit te laten. de oplossing van janoz is wel degelijk goed.

de eerste subexpressie, het gedeelte tussen haakjes, is wat je wel wilt hebben.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Ik begrijp nog niet echt wat je wilt. Stel, je hebt de volgende 2 regels:
code:
1
2
Een regel met het woord dat je niet wilt.
En een regel zonder.


Wat wil je dan als resultaat krijgen?
Verwijderd schreef op maandag 30 januari 2006 @ 11:58:
Ik wil een string matchen waar een bepaald woord niet in voorkomt.
[...]
Dus je wilt alleen de 2de regel van mijn voorbeeld vinden?

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

controleer eerst of het woord er in voorkomt -> zo niet dan heb je regel 2
zo ja: dan met een regex de string voor het woord opvragen.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het ligt iets gecompliceerder en ik zit zelf ook te denken dat het gewoon niet mogelijk is behalve dan op de manier van janoz. En die manier gaat in mijn geval niet op.
Ik denk dan dat het eerst kijken of er bepaalde woorden in voorkomen en dan pas een regex erover uitvoeren toch het beste is.

Misschien om mijn case helemaal te beschrijven. Ik lees een ms word document uit. Hierbij kom ik bijv een tag tegen: <span class="aap" style="font-size:10pt">
Nu kan het zo zijn dat er soms wel een class is en soms niet en zo ook met style. Toch moet de gehele tag gematched worden en dan in mijn array matches kan ik dan kijken of er een class of style in zit.

Ik probeerde in m'n ts het probleem te isoleren alleen is het denk ik niet helemaal gelukt. Ik nu namelijk deze regex en wilde jullie dat besparen:
code:
1
<([a-zA-Z]+)[.]*[^\bclass](class=\"?\'?([a-zA-Z0-9-_]+)\"?\'?)*[^style>.]*(style=\"?\'?([a-zA-Z0-9-_:;\s\.]+)\"?\'?)*>


Waarom is nu bepaalde woorden niet wil matchen is dus dat de regex alle characters moet accepteren ([.]*[^\bclass]) maar totdat het woord class komt, als die er is.

Misschien heb ik het nu alleen maar onduidelijker gemaakt, shoot me :)

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Ok, dat maakt het duidelijker. Je wilt je capture-groups voor o.a. class optioneel maken. Dat kan door een vraagteken achter je capture-group te zetten. Bv.
code:
1
<span [^>]*(class=["']?([a-z0-9-_]+)["']?)?[^>]*>

(niet getest)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke opzich een goed punt alleen dit:
code:
1
[^>]*
leest gewoon voorbij de class omdat hij alles accepteerd behalve een >.
Vandaar dat ik zat te rommelen met dat ie moet lezen tot aan de class. Maw, hij moet alles matchen tot aan class.
Modbreak:Hier op GoT staan we het niet toe dat er binnen 24 uur een topic omhoog geschopt wordt. Niet iedereen is 24/7 online, en alle topics blijven 24 uur lang in onze topiclisting staan. Mocht er binnen die tijd niet gereageerd worden, dan kun je na die 24 uur het topic een schop geven.

[ Voor 40% gewijzigd door NMe op 30-01-2006 19:27 ]


Acties:
  • 0 Henk 'm!

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 25-07 07:34

wizzkizz

smile...tomorrow will be worse

ja, probeer het eens met de negatieve lookahead
code:
1
(?!test)\b\w+\b

dit matcht een woord behalve als dat begint met test, als je nu je tag gaat controleren op attributen kun je controleren of er een attribuut is dat geen class heet door dit principe toe te passen.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

de lookahead werkt over het algemeen met slechts 1 karakter en niet met een heel woord.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 25-07 07:34

wizzkizz

smile...tomorrow will be worse

Salandur schreef op dinsdag 31 januari 2006 @ 08:50:
de lookahead werkt over het algemeen met slechts 1 karakter en niet met een heel woord.
probeer mijn regex dan maar eens uit ;)

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

wizzkizz schreef op zaterdag 04 februari 2006 @ 21:57:
[...]

probeer mijn regex dan maar eens uit ;)
ik zie het. zeker een uitbreiding van PHP die wel errug handig is :)

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Neehoor, als dit PCRE is dan is het standaard:

code:
1
2
3
4
5
6
(?!pattern)

   A zero-width negative look-ahead assertion.  For example "/foo(?!bar)/" 
   matches any occurrence of "foo" that isn't followed by "bar". 
   Note however that look-ahead and behind are NOT the same thing. 
   You cannot use this for look-behind.

Acties:
  • 0 Henk 'm!

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 25-07 07:34

wizzkizz

smile...tomorrow will be worse

Salandur schreef op zondag 05 februari 2006 @ 10:17:
[...]

ik zie het. zeker een uitbreiding van PHP die wel errug handig is :)
nee hoor ik heb het uit Mastering Regular Expressions 2nd Edition van Friedl, wat je echt eens moet lezen als je veel met regex'en werkt.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

dan moet ik maar eens mijn kennis van regular expressions bij gaan spijkeren. ik was nog in de veronderstelling dat een look behind/forward voor maar 1 character gold.

Assumptions are the mother of all fuck ups | iRacing Profiel

Pagina: 1