Toon posts:

[php/regexp] Word boundary en line boundary

Pagina: 1
Acties:

Verwijderd

Topicstarter
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]

  • tomato
  • Registratie: November 1999
  • Niet online
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:
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?

  • tomato
  • Registratie: November 1999
  • Niet online
Heb ook even in PHP met PCRE getest en dit geeft ook gewoon drie keer true:
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?

Verwijderd

Topicstarter
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:
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 :?

  • tomato
  • Registratie: November 1999
  • Niet online
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.

Verwijderd

Topicstarter
Perfecte oplossing. Die lookahead kende ik nog niet.
Bedankt :)
Pagina: 1