In php gebruik ik preg_match om input te controleren. Nu wil ik op hele woorden testen, die al of niet aan het begin van een regel staan. Ik krijg dit alleen voor elkaar met 2 expressions. De ene begint met \b, dus bijvoorbeeld /\bwoord\b/. De andere begint met ^, dus zoiets als /^woord\b/. Kan ik het controleren op word boundary met \b en op het begin van de tekst met ^ op de een of andere manier combineren?
Verwijderd
je kan toch meerdere match-thingys in 1 functie kwijt met | ofzoiets? zal es nakijken
[edit:]
kijk hier eens:
http://www.php.net/manual/en/pcre.pattern.syntax.php
klikken
[/edit]
[edit:]
kijk hier eens:
http://www.php.net/manual/en/pcre.pattern.syntax.php
klikken
[/edit]
Ik probeer het nu net even in perl, maar zoals ik zelf ook had verwacht matcht een \b ook gewoon aan het begin van een regel (als daar een woord start). Dus de volgende programma's geven alledrie true:
Weet je heel zeker dat dit in PHP niet goed gaat? Wat voor regex lib gebruik je, POSIX Extended of PCRE?
code:
1
| print 'hoi mai hee' =~ /\bhoi\b/; |
code:
1
| print 'hoi mai hee' =~ /\bmai\b/; |
code:
1
| print 'hoi mai hee' =~ /\bhee\b/; |
Weet je heel zeker dat dit in PHP niet goed gaat? Wat voor regex lib gebruik je, POSIX Extended of PCRE?
Heb ook even in PHP met PCRE getest en dit geeft ook gewoon drie keer true:
De POSIX Extended regular expressions in PHP lijken geen word-boundaries te kennen (iig niet in de vorm van \b), maar ik zal daarvoor even verder zoeken...
[edit] Het lijkt inderdaad of de POSIX regexen geen word-boundaries kennen (ook geen dingen als \< en \> in sommige versies van egrep). Ze kennen volgens mij ook geen character classes als \w en \W, dus dat zou je zelf moeten maken.
Ik zie nu trouwens al in je post staan dat je PCRE functies gebruikt. Geef eens exacte code en input?
PHP:
1
2
3
4
5
| <? echo preg_match('/\bhoi\b/', 'hoi mai hee'); echo preg_match('/\bmai\b/', 'hoi mai hee'); echo preg_match('/\bhee\b/', 'hoi mai hee'); ?> |
De POSIX Extended regular expressions in PHP lijken geen word-boundaries te kennen (iig niet in de vorm van \b), maar ik zal daarvoor even verder zoeken...
[edit] Het lijkt inderdaad of de POSIX regexen geen word-boundaries kennen (ook geen dingen als \< en \> in sommige versies van egrep). Ze kennen volgens mij ook geen character classes als \w en \W, dus dat zou je zelf moeten maken.
Ik zie nu trouwens al in je post staan dat je PCRE functies gebruikt. Geef eens exacte code en input?
Ik zie nu ook dat in mijn voorbeeld \b matcht het het begin van een regel. Het probleem is echter dat ik het al of niet aanwezig zijn van haakjes om een te zoeken woord wil meenemen in de test. Een voorbeeld:
Bij /\bwoord\b/ geeft ook de versie met haakjes true en dat wil ik niet. Ik heb /[^\w\(]woord[^\w\)]/ geprobeerd, maar dit levert weer false op als woord aan het begin of eind staat. Ik kan dit natuurlijk oplossen door met | meerdere expressions te maken, maar dat wordt me te onoverzichtelijk.
Ik heb allerlei varianten geprobeerd, maar het lukt me niet om een expression te vinden waarbij alle vier de voorbeelden het goede resultaat geven
code:
1
2
3
4
| woord --> moet true opleveren aaa woord bbb --> moet true opleveren aaawoordbbb --> moet false opleveren (woord) --> moet false opleveren |
Bij /\bwoord\b/ geeft ook de versie met haakjes true en dat wil ik niet. Ik heb /[^\w\(]woord[^\w\)]/ geprobeerd, maar dit levert weer false op als woord aan het begin of eind staat. Ik kan dit natuurlijk oplossen door met | meerdere expressions te maken, maar dat wordt me te onoverzichtelijk.
Ik heb allerlei varianten geprobeerd, maar het lukt me niet om een expression te vinden waarbij alle vier de voorbeelden het goede resultaat geven
code:
1
| /\b(?!\()woord(?!\))\b/ |
Werkt zoiets niet? Zal zo nog even zelf proberen...
[edit] Yep, lijkt te werken
(?! bla bla bla ) is een negative lookahead overigens.
Pagina: 1