Sur son billet "utiliser les regex avec modération", Jérôme explique que substr est plus rapide qu'utiliser preg_match. Mon commentaire sur son billet n'est apparement pas encore passé[1], je me permet donc de répondre ici, car sa comparaison est faussée.
$extractedString = substr( $exampleString, 1, -1 );
n'est absolument pas équivalent à
preg_match( '#^\[(\w+)\]$#', $exampleString, $matches );
En effet, dans le premier cas, il n'y a aucune vérification que le premier caractère est bien [ et le dernier ], ni que la chaine à l'intérieur des crochets ne contient que des caractères alphanumérique, contrairement à ce qui se passe dans le deuxième cas avec l'expression régulière.
Aussi, pour avoir une comparaison équitable, il faudrait faire dans le premier cas, au moins ceci :
if(substr($exampleString, 0, 1) =='[' && substr($exampleString, -1) == ']')
$extractedString = substr( $exampleString, 1, -1 );
En conséquence, les résultats des temps d'exécution sont tout autre : le premier cas est de 2 à 5 fois plus long que l'usage de l'expression régulière. Et encore, là, je n'ai pas ajouté de vérification sur le contenu de $extractedString, pour s'assurer qu'il s'agit bien uniquement que de caractères alphanumériques (je vous laisse imaginer le code qu'il faudrait développer sans l'usage d'une expression régulière).
À la limite, l'expression régulière équivalente au premier cas, serait
preg_match( '#^.(.+).$#', $exampleString, $matches );
Et là, effectivement, preg_match est plus lent, mais c'est ici une mauvaise utilisation de preg_match. Pourquoi utiliser une expression régulière si on ne cherche pas à vérifier la syntaxe du contenu ?
Conclusion : n'hésitez pas à utiliser les expressions régulières [2] quand vous voulez extraire des données d'une chaîne et en même temps vérifier l'intégrité du contenu ;-).