2010-06-29 6 views
2

J'ai la chaîneproblème unicode preg_replace en php

$result = "bei einer Temperatur, die etwa 20 bis 60°C unterhalb des Schmelzpunktes der kristallinen Modifikation" 

qui vient directement d'une table MySQL. Le tableau et les en-têtes de php sont tous deux en UTF-8

Je veux enlever le symbole « degré »: http://en.wikipedia.org/wiki/Degree_symbol et le remplacer par le mot « degrés » pour obtenir:

« bei einer Temperatur, Je ne peux pas le faire fonctionner avec preg_replace.

Si je fais:

$result = preg_replace('/\xB0/u'," degrees ", $result); - I get an empty string 

Et si je fais ::

$result = preg_replace('/\u00B0/u'," degrees ", $result); - I get the error: 

Attention: preg_replace() [function.preg-remplacerai]: Compilation a échoué: PCRE ne supporte pas \ L , \ l, \ N, \ U, ou \ u à décalage 1 dans /var/www/html/includes/classes/redeyeTable.inc.php à la ligne 75

Je ne suis pas génial avec les encodages ... qu'est-ce que je fais mal ici?

+0

La première solution que vous publiez fonctionne parfaitement pour moi. – Sjoerd

+0

Selon cette page (et votre message d'erreur BTW), vous ne pouvez pas utiliser http://fr.php.net/manual/fr/reference.pcre.pattern.differences.php – greg0ire

+0

Etes-vous sûr d'avoir le même symbole? Unicode a beaucoup de caractères similaires. – Kobi

Répondre

4

Si vous utilisez le modificateur 'u', le motif est supposé être traité comme utf-8, alors pourquoi ne pas simplement écrire '°' au lieu de '\ u00B0' ou '\ xB0'?

+1

$ resultat = preg_replace ('/ °/u', "degres", $ resultat); fonctionne ... pourquoi ne fonctionne-t-il pas en donnant la chaîne en hexadécimal? –

20

Utilisez

$result = preg_replace('/\x{00B0}/u'," degrees ", $result); 

S'il vous plaît voir here pour plus d'informations sur le \x{FFFF} -syntax.

Il est important de noter la différence entre \xB0 et \x{00B0}:

  • \xB0 désigne un seul caractère avec hex code B0 (176 décimal) qui est le symbole de degré (°) dans la norme ISO-8859-1 pour l'exemple
  • \x{00B0} indique le code de code Unicode U+00B0 qui décrit le symbole du degré (°) dans le système Unicode. Ce code sera codé en utilisant deux octets \xC2\xB0 lors de l'utilisation du codage UTF-8.
+0

Ça marche!Merci Stefan et tous ceux qui ont contribué. Mon erreur n'utilisait pas le {} autour du codepoint Unicode. J'apprécie la différence entre \ xB0 et \ x {00B0} - c'était un essai et une erreur plus désespérés qui m'avaient permis de régler le remplacement de \ xB0 sur une chaîne unicode. Stackoverflow est de nouveau une bouée de sauvetage! –

+2

@Ed: Vous pouvez marquer la réponse comme "acceptée" pour montrer aux autres utilisateurs que c'est la solution à votre problème. –

+0

Je ne sais pas combien d'heures j'ai passé à chercher pourquoi mon regex pour remplacer certains caractères UTF8 ne fonctionnait pas, et grâce à cette astuce avec \ xNN vs \ x {NN}, j'ai finalement réussi. Merci beaucoup Stefan :-) – dregad