14

我在 utf-8 php 文件中有以下 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"

因此,正则表达式在 Windows 上按我预期的那样工作,但在 linux 上却不行。

所以主要问题是,我应该如何编写我的正则表达式以仅在单词边界处匹配?

第二个问题是如何让 Windows 知道我想在我的 php 应用程序中使用 utf-8。

4

4 回答 4

19

即使在 UTF-8 模式下,标准类速记也喜欢\w且不\b支持 Unicode。你只需要使用 Unicode 速记,就像你制定的那样,但你可以通过使用环视而不是交替来使它不那么难看:

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

还要注意我是如何将大括号从 Unicode 类速记中去掉的;当类名由一个字母组成时,您可以这样做。

于 2010-03-15T17:12:57.133 回答
5

猜猜这与错误 #52971有关

PCRE-Meta-Characters 喜欢\b \w不使用 unicode 字符串。

在 PHP 5.3.4 中修复

PCRE 扩展:修复了错误 #52971PCRE-Meta-Characters 不适用于 utf-8)。

于 2016-12-10T10:32:13.107 回答
4

这是我到目前为止发现的。通过像这样重写搜索和替换模式:

$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)

在我运行 apache 的 Windows 计算机和运行 apache 的托管 linux 网络服务器上。

我认为有一些更好的方法可以做到这一点。

另外,我仍然想将我的 windows 计算机设置为 utf-8。

于 2010-03-12T14:37:30.247 回答
0

根据此评论,这是 PHP 中的一个错误。使用\W而不是\b带来任何好处吗?

于 2010-03-14T14:25:24.407 回答