2012-10-02 57 views
2

下面是一个简单的测试程序:的preg_match不匹配重音字符

<?php 
$n = "Baden-Württemberg"; 
preg_match ("/(.*)([^[:print:]])(.*)/", $n, $m); 
print_r ($m); 
?> 

我希望这不符合[^[:print:]]但输出是这样的:

Array 
(
    [0] => Baden-Württemberg 
    [1] => Baden-W� 
    [2] => � 
    [3] => rttemberg 
) 

我也试过/(.*)([^\p{L}\p{M}*\s'-\.])(.*)//(.*)([^[:print:]])(.*)/u但得到相同的结果,除了/u给出$m[2]='ü'而不是

如何匹配重音字符? This answer在我的情况下没有工作。

+0

你应该更适当地命名你的变量。如果你开始烹饪字母汤,那么你肯定会在以后很糟糕的时间。 '$ string'和'$ matches'也可以工作。 –

+0

你在运行什么操作系统?具有5.3.15 /'LC_CTYPE = UTF-8'的Ubuntu似乎正确匹配。 –

+0

嗯......所以**你想要匹配吗?你最后一个'/ u'的例子在PHP 5.3.8的Windows 7上对我来说工作的很好。没有'/ u'就好像你以后说的那样......第一个问号不见了,第二个问题变成了'ü'。 –

回答

0

我不太清楚你想在这里实现什么。

preg_match('/[[:^print:]]/u', '$n, $m); 

精确匹配重音字符(你可以使用[[:^print:]]以及[^[:print:]]其在这里产生相同的结果)。

如果在模式中使用(.*),那么使用U修饰符(非语言)通常很有用。在你的第一个例子中,这将产生以下结果:

$n = "Baden-Württemberg"; 
preg_match ("/(.*)([^[:print:]])(.*)/uU", $n, $m); 
print_r ($m); 

Array 
( 
[0] => Baden-Wü 
[1] => Baden-W 
[2] => ü 
[3] => 
)