4 votes

Couper les espaces unicode PHP

J'essaie de couper les espaces unicode comme ceci caractères et j'ai pu le faire en utilisant ceci solution .. Le problème avec cette solution est qu'elle ne coupe pas les espaces unicodes entre les caractères normaux. Espace fin

$string = "teststring";
echo preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $string);
// outputs: teststring

Je n'ai qu'une petite connaissance des RegEx et je ne sais pas quoi modifier dans mon expression pour résoudre ce problème.

8voto

jspit Points 707

Ces espaces Unicode comment \u {2009} causent des problèmes à divers endroits. Je remplacerais donc tous les espaces unicodes par des espaces normaux, puis j'appliquerais la fonction trim().

$string = "teststringand XY \t";
//\u{2009}\u{2009}\u{2009}test\u{2009}\u{2009}\u{2009}string\u{2009}and\x20XY\x20\x09\u{2009}

$trimString = trim(preg_replace('/[\pZ\pC]/u', ' ', $string));
//test\x20\x20\x20string\x20and\x20XY

Note : La représentation des chaînes de caractères dans le commentaire a été faite avec debug::writeUni($string, $trimString) ; réalisé à partir de cette classe .

2voto

Wiktor Stribiżew Points 100073

Pour supprimer tous les espaces blancs Unicode avec les caractères de contrôle au début et à la fin de la chaîne, et supprimer tous les espaces blancs Unicode avec les caractères de contrôle autres que l'espace normal n'importe où dans la chaîne, vous pouvez utiliser

preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$|(?! )[\pZ\pC]/u', '', $string)
// Or, simply
preg_replace('/^\s+|\s+$|[^\S ]/u', '', $string)

Ver el Démonstration de regex #1 et regex démo #2 .

Détails

  • ^[\pZ\pC]+ - un ou plusieurs caractères d'espacement ou de contrôle au début de la chaîne de caractères
  • | - ou
  • [\pZ\pC]+$ - un ou plusieurs caractères d'espacement ou de contrôle à la fin de la chaîne de caractères
  • | - ou
  • (?! )[\pZ\pC] - un ou plusieurs espaces ou caractères de contrôle autres qu'un espace normal, n'importe où dans la chaîne de caractères
  • [^\S ] - tout espace blanc autre qu'un espace normal ( \x20 )

Si vous devez également "exclure" les caractères de retour à la ligne courants, remplacez (?! )[\pZ\pC] con (?![ \r\n])[\pZ\pC] (comme suggéré par @MonkeyZeus ), dans la deuxième regex, cela signifie que vous devez utiliser [^\S \r\n] .

Ver Démo PHP :

echo preg_replace('~^[\pZ\pC]+|[\pZ\pC]+$|(?! )[\pZ\pC]~u', '', 'abc def ghi      ');
// => abc defghi
echo preg_replace('/^\s+|\s+$|[^\S ]/u', '', 'abc def ghi     ');
// => abc defghi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X