Question

J'ai le code php suivant dans un fichier php utf-8:

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));

Je voudrais la dernière regex pour remplacer seulement des mots entiers et non parties de mots.

Sur mon ordinateur windows, il retourne:

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)

Sur le serveur Web (linux), je reçois:

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"

Ainsi, l'expression rationnelle fonctionne comme je m'y attendais sur les fenêtres, mais pas sur linux.

La question principale est, comment dois-je écrire mon regex corresponde uniquement à des limites de mots?

Une question secondaire est de savoir comment je peux laisser les fenêtres savent que je veux utiliser utf-8 dans mon application php.

Était-ce utile?

La solution

Même en mode UTF-8, sténographies de classe standard comme \w et \b ne sont pas compatibles Unicode. Il vous suffit d'utiliser les raccourcis Unicode, comme vous avez travaillé, mais vous pouvez le rendre un peu moins laid en utilisant lookarounds au lieu d'alternances:

/(?<!\pL)weiß(?!\pL)/u

Remarquez aussi comment je quittai les accolades sur les raccourcis de classe Unicode; vous pouvez le faire que lorsque le nom de la classe se compose d'une seule lettre.

Autres conseils

Voici ce que je l'ai trouvé à ce jour. En réécrivant les modèles de recherche et de remplacement comme ceci:

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

obtenir le résultat recherché:

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

sur les deux mon ordinateur windows apache en cours d'exécution et sur le serveur web linux hébergé apache en cours d'exécution.

Je suppose qu'il ya une meilleure façon de le faire.

En outre, je voudrais encore setlocale mon ordinateur Windows à utf-8.

Devinez c'était lié à Bug # 52971

  

PCRE-Métacaractères comme \b \w ne fonctionne pas avec des chaînes unicode.

et fixé dans PHP 5.3.4

  

l'extension PCRE. Correction d'un bug # 52971 ( PCRE-Métacaractères ne fonctionne pas avec utf-8 )

Selon ce commentaire , qui est un bogue dans PHP. Est-ce que l'aide \W au lieu de \b donner un avantage?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top