2014-07-08 3 views
-1

Pourquoi preg_match pour PHP et d'autres fonctions regex d'autres langues ont des délimiteurs comme // dans la chaîne indiquant le modèle à rechercher? Je n'ai presque aucune expérience avec regex, mais la raison pour laquelle deux de ces délimiteurs indiquent le début et la fin d'une chaîne pattern n'est pas évidente pour moi, parce que vous pourriez simplement utiliser le début et la fin de la chaîne.À quoi servent les barres obliques dans les fonctions regex?

+0

Et vous n'avez pas trouvé de réponse de cela dans les documents PHP OU ailleurs? – anubhava

+0

Merde, je suis un idiot @anubhava. D'accord, la raison est évidente maintenant. Un endroit pour mettre des drapeaux à la fin des cordes. Par exemple (docs PHP): '// Le" i "après le délimiteur de pattern indique une recherche insensible à la casse'. Quelle est la ligne de conduite appropriée, puisque c'est une question triviale ... pour fermer ma question maintenant? – ironicaldiction

+0

Si vous voulez, vous pouvez simplement supprimer votre réponse. – anubhava

Répondre

0

D'une manière générale, les antislashs sont des évasions. Ils suppriment la signification d'un personnage pour que le personnage soit traité comme ce à quoi il ressemble littéralement. Dans d'autres cas, les barres obliques inverses ajoutent une signification à un omble, le transformant en métacaractère. par exemple, dans les expressions rationnelles:

/d/ - look for a character "d" 
/\d/ - look for a digit: 0,1,2,3,4,5,6,7,9, aka [0-9] - adding significance 
/\\/ - look for a literal \ char - REMOVING significance 

Les // sont des barres obliques. Ce ne sont que les délimiteurs standard par défaut, car ce sont les délimiteurs standard utilisés dans Perl, et PHP implémente les expressions régulières compatibles PCRE-Perl.

$m =~ /d/ - perl for matching a "d" character in a string 
$m =~ /\d/ - perl for matching a digit 

En PHP, car les expressions rationnelles ne sont que des chaînes, ne fait pas partie de la langue de base, vous pouvez utiliser tout délimiteur que vous voulez. Le premier caractère de votre modèle devient le délimiteur:

preg_match('/foo/', $str) #1, using/forward slashes as delimiter 
preg_match('|foo|', $str) #2, using | pipes as delimiters 
preg_match('f\foof', $str) #3, using the letter F as delimiter 

Notez maintenant que vous pouvez utiliser n'importe quel caractère. f Dans la 3ème regex est le premier caractère du modèle, donc c'est le délimiteur. Ce qui signifie que si vous utilisez cette regex pour rechercher un "f" dans votre texte, vous devez échapper à F (\f), de sorte que le F interne est vu comme un f, pas comme le délimiteur de modèle

0

PHP utilise des expressions régulières de type Perl, donc je suppose que Perl a 'inventé' cette syntaxe.

Ces délimiteurs sont utilisés pour ajouter certains modificateurs à l'expression régulière. Bien sûr PHP pourrait aussi utiliser des drapeaux dans l'appel de la fonction ou quelque chose comme ça pour le faire mais cela changerait la syntaxe de Perl. Je pense donc que ces délimiteurs sont utilisés à des fins historiques.

Questions connexes