[PHP] regex, geen goeie match?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik dit doe:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$string = "#abb";
if (ereg ("\043\w*", $string, $regs)) {
    foreach ($regs as $match) {
        echo $match;
    }
} else {
   echo "Geen match.";
}
?>


Krijg ik als match "#" en niet "#abb" zoals in mijn test programma Expresso of zoals ik het terug zou krijgen als ik in vb.net zou werken. Ik zeg zoals ik het in feite zie, geef me elke combinatie van tekens die begint met ASCII char 043 (# dus) gevolgd door (een combinatie van alpha numerieke tekens) -> onafhankelijk van hoevaak ze elkaar volgen.

Ligt het gebruik van regex iets anders in PHP of zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom gebruik je niet gewoon # in je regexp in plaats van de bytecode die erbij hoort? Ik zou iets als dit proberen:
PHP:
1
2
3
4
5
6
7
8
$string = "#abb blaat #nogwat";
if (preg_match_all("/#\w+/", $string, $matches)) {
    echo "<pre>";
    print_r($matches);
    echo "</pre>";
} else {
    echo "Geen match.";
}

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Omdat ik ook met " characters werk, en die hebben een betekenis.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
De ereg-functies in PHP werken met POSIX reguliere expressies, en die kennen \w (en een heleboel andere dingen) niet, want dat zijn Perl-specifieke extensies. De reguliere expressie interpreteert \w dus gewoon als 'w' en probeert daar zoveel mogelijk van te matchen.

Met ereg zou je zoiets moeten schrijven: \043[a-zA-Z0-9_]*, of als je geen equivalente expressie nodig hebt gewoon \043[[:alpha:]]* (matcht alleen letters) of \043[[:alnum:]] (matcht alfanumerieke karakters, oftewel letters en cijfers).

edit:
Ik ben het trouwens wel met -NMe- eens dat je beter gewoon # of \" kan schrijven. Die dubbele quote moet je misschien escapen (maar je kunt ook overwegen om enkele quotes te gebruiken, als je toch geen variabelen gaat expanden binnen je string) maar dan nog is het duidelijker dan \0123 (of whatever de ASCII code van " in basis 8 is).

[ Voor 25% gewijzigd door Soultaker op 17-11-2006 20:49 ]