2009-09-16 5 views
3

Voici un petit exemple (téléchargement, renommer .php et l'exécuter dans votre shell):preg_replace - Résultat NULL?

test.txt

Pourquoi preg_replace NULL de retour au lieu de la chaîne d'origine?

\x{2192} est identique au code HTML "→" ("→").

+3

Veuillez poster le code correspondant ici. – Gumbo

+0

Si vous copiez et collez, la valeur NULL ne sera pas retournée. Le problème semble être lié à des caractères spéciaux dans la chaîne. Si je publie le code, ils ne seront pas conservés. – Ree

Répondre

2

De la documentation sur preg_replace():

Valeurs de retour

preg_replace() retourne un tableau si le paramètre subject est un tableau, ou une chaîne autrement.

Si des correspondances sont trouvées, le nouveau sujet sera retourné, sinon sujet sera retourné inchangé ou NULL si une erreur est survenue .

Dans votre modèle, je ne pense pas que le drapeau est supporté. Edit: Cela semble être une sorte de problème d'encodage avec le sujet. Lorsque j'efface '147 3.2 V6 - GTA (184 kW)' et que je le re-saisis manuellement, tout semble fonctionner.

Édition 2: Dans le modèle que vous avez fourni, il y a 3 espaces qui semblent poser des problèmes au moteur regex. Quand je les convertis en décimales, leur valeur est 160 (par opposition à l'espace normal 32). Lorsque je remplace ces espaces par des espaces normaux, cela semble fonctionner.

J'ai remplacé les espaces offensants par des underscores ci-dessous:

 
'147 3.2 V6 - GTA (184 kW)' 
'147 3.2_V6 - GTA_(184_kW)' 
+0

"Dans votre modèle, je ne pense pas que le drapeau est supporté." Veuillez élaborer. Comment ne pas être supporté? Vous indiquez simplement que le modèle doit être traité comme une chaîne UTF-8. – Ree

+0

@Ree Ouais j'ai eu un moment de retard. Ne tenez pas compte de cela. –

+0

Oui, il semble que PHP a des problèmes pour lire la chaîne. Il a été lu à partir d'un fichier Excel en utilisant une bibliothèque PEAR ... – Ree

-3

Je crois qu'il ya aussi un défaut dans votre expression Regex: ~\x{2192}~u

Essayez de remplacer ce que j'ai et voir si cela fonctionne sur Pour vous: /\x{2192}/u

+2

Vous avez tort. L'expression est bien. – Ree

+0

Alors que l'expression est correcte, \ x {2192} n'a aucun sens en PHP, elle n'accepte que les codes hexadécimaux 0-255 – razzed

+1

@razzed: Vous avez tort. S'il vous plaît lire mon commentaire pour votre réponse. – Ree

-1
  • Vous utilisez des guillemets simples, ce qui signifie que vous ne pouvez vous échapper que des guillemets simples. Pour activer les séquences d'échappement (par exemple \x32, puis utiliser des guillemets doubles "")
  • Je ne suis pas un expert UTF8, mais le code d'échappement \x2192 n'est pas correct non plus. Vous pouvez faire: \x21\x92 pour obtenir les deux octets dans votre chaîne, mais vous voudrez peut-être regarder utf8_encode et utf8_decode
  • Votre source contient des caractères invalides ou quelque chose comme ça. PHP donne: Attention: preg_replace(): Compilation échoué: invalide chaîne UTF-8 à l'offset 0 dans test.php sur la ligne 7
+1

Votre premier point est faux - le style de citation n'a aucun effet ici. Essayez ceci: "echo preg_replace ('~ \ x {20AC} ~ u', 'EUR', '€ 1000');". Vous obtiendrez le symbole de l'euro remplacé par EUR. Votre deuxième point est faux, aussi. De la documentation php: "En mode UTF-8," \ x {...} "est autorisé, le contenu des accolades étant une chaîne de chiffres hexadécimaux interprétée comme un caractère UTF-8 dont le numéro de code est le nombre hexadécimal donné. ". Votre troisième point - je ne reçois pas cet avertissement sur ma machine, mais oui, il semble que la chaîne est malformée dans la vue de PHP. La chaîne a été lue à partir d'un fichier Excel ... – Ree

2

J'ai eu une réponse nulle quand mon expression régulière comprenait la uUTF-8 PCRE modifier. Si votre texte source est et non UTF et que vous avez ce modificateur, vous obtiendrez un résultat nul.

+2

L'inverse est également vrai - si vous avez une chaîne UTF, vous obtiendrez un résultat nul si vous n'incluez pas le modificateur 'u'. –

Questions connexes