2010-02-26 3 views
0

J'utilise la fonction preg_replace pour remplacer les accents dans une chaîne, je travaille avec UTF-8.Mémoire fuite avec preg_replace

J'ai engagés dans ce qui semble être une fuite de mémoire, mais je ne peux pas isoler la cause racine, mon code est assez simple:

preg_replace(
     array_keys($aToNoAccents), 
     array_values($aToNoAccents), 
     $sText 
    ); 

$aToNoAccents est un tableau associatif avec des entrées comme '~[Ą]~u' => 'A', '~[Ć]~u' => 'C',. Mes impressions script cette erreur pour la ligne ci-dessus:

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3039 bytes) 

Il est évident que ce n'est pas une question de plus en plus la mémoire autorisée pour PHP, (une empreinte 1Go est loin l'échelle de ma demande). De plus, cette ligne est exécutée des milliers de fois sans problème mais, pour certains cas difficiles à reproduire, elle génère l'erreur.

Quelqu'un a-t-il connaissance de problèmes de mémoire avec les chaînes preg_replace et UTF-8? Est-ce que je dois utiliser un soin particulier pour transmettre les paramètres réels à une telle fonction?

J'utilise PHP 5.2.6-3 avec Suhosin-Patch

+2

Ces expressions rationnelles sont-elles? Sinon, vous devriez probablement utiliser 'str_replace' à la place et voir si cela fonctionne mieux? –

+0

Oui, peut-être que je n'ai pas besoin d'être regex après tout. Je fais un essai –

Répondre

3

Avez-vous essayé iconv au lieu de votre carte de handcrafting remplacement?

Adaptation de l'exemple du manuel PHP

$text = "A String with lots of weird chars, like ĄĆ"; 

echo 'Original : ', $text, PHP_EOL; 
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL; 
echo 'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL; 
echo 'Plain : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL; 

produirait

Original : A String with lots of weird chars, like AC 
TRANSLIT : A String with lots of weird chars, like AC 
IGNORE : A String with lots of weird chars, like AC 
Plain : A String with lots of weird chars, like AC 

Mais cela ne serait pas nécessairement travailler avec tous les caractères que vous jetez dans. Faites un essai avec vos touches souhaitées.

+0

Ce serait une bonne idée, mais malheureusement pour certains pays j'ai besoin d'avoir un contrôle total sur le caractère qui est traduit à qui, donc je ne peux pas utiliser un outil externe pour cette tâche. –

1

j'ai eu même problème (fuite de mémoire) pas avec preg_replace et i « entendu » que probablement son un bogue dans PHP 5.2

Je ne sais pas, mais si vous essayez le même script avec php 5.0 pourrait fonctionner.

Juste pour l'enregistrement.

+1

Si c'est un bug connu en PHP, vous le trouverez sur http://bugs.php.net/ – Gordon

+0

Ouais, pouvez-vous ajouter un lien ici qui mène au bug? – Till

+1

Il ya un écrit ici qui suggère preg_replace caches jusqu'à 4096 résultats dans une demande: http://blog.killtheradio.net/tricks-hacks/phps-preg-functions-dont-release-memory/ –