2010-10-14 8 views
2

Je dois trouver et remplacer la sous-chaîne par un point. Il est important de garder la recherche stricte aux limites des mots (\ b). Voici un exemple de script pour reproduire (je dois correspondre à "test".):Motif correspondant avec point en PHP

<?php 
# 1.php 
$string = 'test. lorem ipsum'; 
if(!preg_match('~\btest\.\b~i', $string)) echo 'no match 1' . PHP_EOL; 
if(!preg_match('~\btest\b\.~i', $string)) echo 'no match 2' . PHP_EOL; 

Et voici la sortie:

x:\>php 1.php 
no match 1 

x:\>php -v 
PHP 5.2.8 (cli) (built: Dec 8 2008 19:31:23) 
Copyright (c) 1997-2008 The PHP Group 

BTW, je ne pas non plus obtenir un match s'il es carré crochets dans le motif de recherche. Je leur échappe bien sûr, mais toujours aucun effet.

Répondre

2

Les expressions régulières ne peuvent pas lire; ils ne savent pas vraiment ce qu'est un "mot". Pour eux, une limite de mot est tout simplement une position qui est soit précédée d'un caractère de mot et non suivi d'un ou suivi d'un caractère de mot et non précédé d'un:

(?<=\w)(?!\w)|(?=\w)(?<!\w) 

Ainsi, la position après l'. en le premier premier test ne serait qu'une frontière de mot s'il était suivi d'un autre caractère ([A-Za-z0-9_]; dans certains cas, la définition est basée sur une plus large gamme de caractères, y compris les lettres anglaises accentuées et les lettres d'autres scripts, mais en PHP seulement Lettres et chiffres ASCII).

Je suppose que ce que vous voulez faire est de vous assurer que le . est suivi par un espace, ou à la fin de la chaîne. Vous pouvez exprimer que directement comme avant positive:

'~\btest\.(?=\s|$)~i' 

... ou plus succinctement, comme négatif préanalyse:

'~\btest\.(?!\S)~i' 

... autrement dit, si il y a un caractère suivant Ce n'est pas un caractère non-blanc.

+0

Merci pour la correction de ma réponse ;-) – zerkms

+0

Merci pour votre réponse, maintenant je comprends bien. En ce qui concerne ma tâche initiale, j'ai besoin de rechercher des morceaux de texte précis, et le point vient dans le cadre de la contraction. Par exemple: "sm. AEL", "un peu de nom [info]", etc. – user475255