-1

我的目标

对于“作者姓名输入”,确保只输入空格和 utf-8 字母。我的网站语言是土耳其语,土耳其语字母表有非英语字符。

我奇怪的问题

此正则表达式适用于 rubular.com
如果输入字符串:“Selim Çınar”结果:匹配
如果输入字符串:“Selim Çınar 12”结果:不匹配
正则表达式:/^[\p{L} ]+$/u

然后我在我的网站上创建了 trial.php 并在下面运行代码

1

echo '<br /><br /><br />';
    $str ='Selim Cinar';
    if (!preg_match("/^[\p{L} ]+$/u", $str))
    {echo 'no, not only utf-8 letters and spaces';}
    else {$str.' yes utf-8 letters and spaces';}
echo '<br /><br /><br />';

上面代码的结果<br />:在源页面只有标签的空页面

2

echo '<br /><br /><br />';
    $str ='Selim Çınar'; //includes Tr characters
    if (!preg_match("/^[\p{L} ]+$/u", $str))
    {echo 'no, not only utf-8 letters and spaces';}
    else {$str.' yes utf-8 letters and spaces';}
echo '<br /><br /><br />';

上面代码的结果<br />:在源页面只有标签的空页面

3

代码来源: http: //php.net/manual/en/function.ctype-alpha.php

    $str ='Selim Çınar'; //includes Tr characters
    $str =trim($str);
    $str = str_replace(' ', '', $str);
    setLocale(LC_CTYPE, 'TR_tr.UTF-8');
    if (ctype_alpha($str)) {echo 'yes utf-8 letters';}
    else {echo 'no, not only utf-8 letters';}

上面代码的结果:不,不仅是 utf-8 字母

4

代码来源: http: //php.net/manual/en/function.ctype-alpha.php

    $str ='Selim Cinar';
    $str =trim($str);
    $str = str_replace(' ', '', $str);
    setLocale(LC_CTYPE, 'TR_tr.UTF-8');
    if (ctype_alpha($str)) {echo 'yes utf-8 letters';}
    else {echo 'no, not only utf-8 letters';}

上面代码的结果:是 utf-8 字母

我的phpinfo

PHP 版本 5.4.10
Apache 2.0 处理
程序 Apache API 版本:20051115
PCRE(Perl 兼容正则表达式)支持启用
PCRE 库版本 8.20 2011-10-21

关于 trial.php

trial.php 是纯 php。没有 html 标头声明。

我的问题

  1. 为什么我的案例 1 和案例 2 {! 更新:由 MikeM 解决 }
  2. 为什么案例 3 不将“SelimÇınar”理解为 utf-8?我的代码是假的吗(setLocale部分可能)?

更新

问题 1 由 MikeM 解决。

**问题 2 仍然作为问题存在。

4

2 回答 2

1

对于案例 1 和 2,您只会得到一个空页面,因为正则表达式成功匹配$str,因此else分支被执行,但是没有echo,所以没有打印任何内容。

我不知道你的第二个问题的答案。对setLocale我来说看起来不错,但它的行为取决于系统。

于 2013-03-29T10:28:44.283 回答
1

不要使用setlocaleor utf8_decode,你的问题很简单,因为你的 php 源文件没有以 UTF-8 保存。这取决于您的文本编辑器。

当您正确保存文件时,这将起作用:

$str = 'Selim Çınar'; //Since this is a string literal, its encoding is determined by
                     //how this source file was saved
if (preg_match("/^[\p{L} ]+$/u", $str)) {
    echo 'yes only utf-8 letters or spaces';
} else {
    echo 'no, not only utf-8 letters or spaces';
}
于 2013-03-29T12:04:52.303 回答