Соответствие границе слова php regex в utf-8

У меня есть php-код в файле utf-8 php:

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

Я хотел бы, чтобы последнее регулярное выражение заменяло только полные слова, а не части слов.

На моем компьютере с Windows он возвращает:

 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) 

На веб-сервере (linux) я получаю:

 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" 

Таким образом, регулярное выражение работает так, как я ожидал, на окнах, но не на linux.

Итак, главный вопрос: как я должен писать свое регулярное выражение только для соответствия границам слов?

Вторичные вопросы – это то, как я могу сообщить Windows, что я хочу использовать utf-8 в своем приложении php.

Даже в режиме UTF-8 стандартные сокращения классов, такие как \w и \b , не поддерживают Unicode. Вам просто нужно использовать сокращения Unicode, как вы это выработали, но вы можете сделать его немного менее уродливым, используя образы вместо чередования:

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

Обратите внимание также, как я оставил фигурные скобки из сокращенных классов Unicode; вы можете сделать это, когда имя класса состоит из одной буквы.

вот что я нашел до сих пор. Переписывая шаблоны поиска и замены следующим образом:

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

Я получаю желаемый результат:

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

на моем компьютере с Windows, на котором запущен apache, и на размещенном веб-сервере linux, использующем apache.

Я предполагаю, что есть лучший способ сделать это.

Кроме того, я все равно хотел бы установить мой компьютер с Windows на utf-8.

Угадайте, что это было связано с ошибкой # 52971

PCRE-мета-символы, такие как \b \w не работают со строками unicode.

и исправлено в PHP 5.3.4

Расширение PCRE: исправлена ​​ошибка # 52971 ( PCRE-мета-символы, не работающие с utf-8 ).

Согласно этому комментарию , это ошибка в PHP. Использует ли \W вместо \b любую выгоду?