web-dev-qa-db-fra.com

Comment remplacer un espace non cassable décodé (nbsp)

En supposant que j'ai une piqûre qui est "a s d d" Et htmlentities la transforme en
"a s d d".

Comment le remplacer (en utilisant preg_replace) sans le coder en entités?

J'ai essayé preg_replace('/[\xa0]/', '', $string);, mais cela ne fonctionne pas. J'essaie de supprimer ces caractères spéciaux de ma chaîne car je n'en ai pas besoin

Quelles sont les possibilités au-delà de l'expression rationnelle?

Modifier la chaîne que je veux analyser: http://Pastebin.com/raw/7eNT9sZr
avec la fonction preg_replace('/[\r\n]+/', "[##]", $text)
pour plus tard implode("</p><p>", explode("[##]", $text))

Ma question n'est pas exactement "comment" faire cela (puisque je pourrais encoder des entités, supprimer des entités dont je n'ai pas besoin et décoder des entités). Mais comment supprimer ceux avec juste str_replace ou preg_replace.

16
Grzegorz

Le problème est que vous spécifiez le espace insécable d'une manière incorrecte. Le code approprié de l'espace insécable dans le codage UTF-8 est 0xC2A0, il se compose de deux octets - C2 (194) et A0 (160), vous ne spécifiez que la moitié du code du caractère.

Vous pouvez le remplacer en utilisant le simple (et rapide) str_replace ou en utilisant une expression régulière plus flexible, selon vos besoins:

// faster solution
$regular_spaces = str_replace("\xc2\xa0", ' ', $original_string);

// more flexible solution
$regular_spaces = preg_replace('/\xc2\xa0/', ' ', $original_string);

Notez que en cas de str_replace , vous devez utiliser des guillemets doubles (") pour entourer la chaîne de recherche car il ne comprend pas la représentation textuelle des codes de caractères il a donc besoin que ces codes soient d'abord convertis en caractères réels. Cela est fait automatiquement par PHP car les chaînes entre guillemets sont en cours de traitement et des séquences spéciales (par exemple, caractère de nouvelle ligne \n, représentation textuelle des codes de caractères, etc.) sont remplacés par des caractères réels (par exemple 0x0A pour \n en UTF-8) avant d'utiliser la valeur de chaîne.

En revanche, le preg_replace fonction elle-même comprend la représentation textuelle des codes de caractères donc vous n'avez pas besoin de PHP pour les convertir en caractères réels et vous pouvez utilisez des apostrophes (guillemets simples, ') pour entourer la chaîne de recherche dans ce cas.

Le codage UTF-8 est appelé codage de caractères à largeur variable, ce qui signifie que les codes de caractères sont constitués d'un à quatre octets (8 bits). En général, les caractères les plus fréquemment utilisés ont des codes plus courts tandis que les caractères plus exotiques ont des codes plus longs.

34