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 ;-).

Notes

[1] c'est bon, problème réglé, mais je laisse ce billet en ligne quand même :-)

[2] uniquement avec les fonctions preg_*, et non pas ereg_*, qui sont obsolètes et plus lentes