【问题标题】:preg_match isn't matching accented characterspreg_match 不匹配重音字符
【发布时间】:2012-10-02 17:07:51
【问题描述】:

这是一个简单的测试程序:

<?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 在我的情况下不起作用。

【问题讨论】:

  • 你应该更恰当地命名你的变量。如果你开始煮字母汤,你以后肯定会过得很糟糕。 $string$matches 也同样有效。
  • 你运行的是什么操作系统?带有 5.3.15 / LC_CTYPE=UTF-8 的 Ubuntu 似乎匹配正确。
  • Ummm...那么您想要匹配的做什么?最后一个带有/u 的示例也适用于我在带有PHP 5.3.8 的Windows 7 上。没有/u,就像你后面说的那样……第一个问号消失了,第二个变成了ü

标签: php regex


【解决方案1】:

我不太确定你想在这里实现什么。

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] => 
) 

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2012-09-13
    • 1970-01-01
    • 2011-03-14
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多