2012-10-02 58 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] => 
)