Pregunta

Tengo el siguiente código PHP en un archivo 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'));

Me gustaría que la última expresión regular para reemplazar sólo palabras completas y no partes de palabras.

en el equipo Windows, devuelve:

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)

En el servidor web (Linux), me sale:

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"

Por lo tanto, la expresión regular funciona como esperaba en las ventanas, pero no en Linux.

Así que la pregunta principal es, ¿cómo debo escribir mi expresión regular para solo en los límites de palabra?

A preguntas secundarias es la forma en que puedo dejar ventanas saben que yo quiero usar UTF-8 en mi aplicación PHP.

¿Fue útil?

Solución

Incluso en el modo UTF-8, taquigrafías clase estándar como \w y \b no son compatibles con Unicode. Sólo tienes que utilizar las abreviaturas Unicode, mientras trabajaba, pero puede que sea un poco menos feo utilizando lookarounds en lugar de alternancias:

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

Nótese también cómo dejé las llaves fuera de las abreviaturas de clase Unicode; que puede hacer que cuando el nombre de la clase se compone de una sola letra.

Otros consejos

Esto es lo que he encontrado hasta ahora. Al volver a escribir los patrones de búsqueda y reemplazo de la siguiente manera:

$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ß'));

Me sale el resultado deseado:

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

tanto en mi ordenador con Windows Apache corriendo y corriendo Apache en el servidor web alojada Linux.

Asumo que hay alguna forma mejor de hacer esto.

Además, todavía me gustaría setlocale mi equipo ventanas a UTF-8.

Guess esto estaba relacionado con Bug # 52971

  

pcre-meta-caracteres como \b \w no trabajar con cadenas Unicode.

y fijado en PHP 5.3.4

  

extensión PCRE:. Solución de error # 52971 ( pcre-meta-caracteres no trabajan con UTF-8 )

De acuerdo con este comentario , es decir un fallo en PHP. ¿El uso \W en lugar de \b dar ningún beneficio?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top