2010-07-12 3 views
4

Je sais qu'il y a plusieurs types d'espace (em espace, espace, espace fin, espace insécable, etc.), mais tous ceux que j'ai mentionnés ont des entités HTML (au moins, les htmlentities de PHP() renvoient quelque chose comme & emsp ;.Filtrer tous les types d'espaces dans PHP

Mais, qu'en ces espaces qui ne disposent pas des entités HTML
Exemple:. http://iorbix.com/1001-p-Nuno-Peralta
Regardez le surnom de ce compte il a beaucoup « » (espaces) à l'avant, qui sont visibles pour nous (cela ne se produit pas avec le & nbsp;).

J'ai déjà essayé de filtrer avec des expressions régulières, en utilisant \ x escape, filter avec str_replace(), avec l'espace comme argument, et pas de chance du tout!

Avez-vous une suggestion sur la façon de filtrer TOUS les types d'espaces?

+0

L'espace pour regex est '\ s' – knittl

Répondre

18

\s par défaut, sera pas correspondance des caractères blancs avec des valeurs supérieures à 128. Pour obtenir à ceux-ci, vous pouvez plutôt faire bon usage d'autres séquences UTF-8-aware .


(Limites de responsabilités: Je suis écrémage le code source PCRE pour compiler les listes ci-dessous, je manquer un personnage ou taper quelque chose de manière incorrecte S'il vous plaît pardonnez-moi..)

\p{Zs} matches:

  • U + 0020 Espace
  • U + 00A0 Espace insécable
  • U + 1680 marque l'espace Ogham
  • U + 180E séparateur voyelle mongole
  • U + 2000 En quad
  • U + 2001 cadratin
  • U + 2002 Espace En
  • U + 2003 espace Em
  • U + 2004 espace Trois-per-em
  • U + 2005 espace Quatre-per-em
  • U + 2006 espace Six-per-em
  • U + 2007 Figure espace
  • U + 2008 Ponctuation espace
  • U + 2009 espace mince
  • U + 200A espace cheveux
  • U + 202F Affinez espace insécable
  • U + 205F Moyen espace mathématique
  • U + 3000 idéographique espace

\h (d'un espace horizontal) correspond à la même que celle \p{Zs} ci-dessus, plus

  • U + 0009 onglet horizontal.

De même pour l'espacement vertical vertical, il existe quelques options.

\p{Zl} correspond à U + 2028 séparateur ligne.

\p{Zp} correspond à U + 2029 séparateur de paragraphe.

\v (espace vertical) correspond \p{Zl}, \p{Zp} ce qui suit

  • U + 000A Linefeed
  • onglet U + 000B vertical
  • U + 000C Formfeed
  • retourner U + 000D transport
  • U + 0085 Ligne suivante

Pour en revenir au début, en mode UTF-8 (c.-à-d.en utilisant le modificateur de modèle u) \s correspond à tout caractère qui \p{Z} matchs (ce qui est tout ce qui \p{Zs}, \p{Zl} et \p{Zp} correspondront), plus

  • U + 0009 Tabulation horizontale
  • U + 000A Linefeed
  • U + 000C Formfeed
  • U + 000D de retour chariot

Pour couper une longue histoire courte (je parie que vous avez lu tout ce qui précède, n'est-ce pas?) Vous pouvez utiliser \s mais assurez-vous d'être en mode UTF-8 comme /\s/u. Mettre cela à une utilisation pratique, pour filtrer les caractères blancs correspondant d'une chaîne que vous feriez quelque chose comme

$new_string = preg_replace('/\s/u', '', $old_string); 

Enfin, si vous avez vraiment, vraiment à la verticale qui sont des espaces blancs non inclus dans \s (LF et NEL), vous pouvez utiliser la classe de caractères [\s\v] pour faire correspondre les 26 caractères d'espacement énumérés ci-dessus.

+0

ouah! J'ai lu tout, oui, mais, semble que seulement quand j'ai inséré "\ h", cela a fonctionné, donc, le RE final est:/[\ s \ h \ v]/u - Merci beaucoup! – Nuno

+0

+100 - Cela a résolu un problème sur lequel j'ai travaillé toute la journée. –

+0

Je ne sais pas pourquoi, mais aucun d'eux ne trouve '\ u2005' dans mon code PHP. Des idées? – user5950

2

Ils sont tous les espaces simples (retour code de caractère 32) qui peut être pris avec des expressions régulières ou trim().

Essayez ceci:

preg_replace("/\s{2,}/", " ", $text); 
+0

J'utilise (mb_) trim() par défaut pour toutes les entrées de l'utilisateur, et j'ai déjà essayé, et les deux ne fonctionnent pas. Merci de votre aide. – Nuno

Questions connexes