用于验证西里尔文的正则表达式

时间:2011-04-01 07:38:04

标签: php

我有一个PHP函数来验证“城市”:

function validate_city($field) {
    if ($field == "") return "Enter city.<br />";
    else if (preg_match("/[^а-Яa-zA-z-]/", $field))
        return "City hame only from letters and -.<br />";
    return "";
}

每当我输入西里尔城市名称(例如“Минск”)时,它返回: 城市hame只来自字母和 - 。 变量$ _POST ['city']看起来像: Ð Ð¸Ð½Ñ Ðº

在JS中,这段代码是正确的,我认为有些东西是编码.....

7 个答案:

答案 0 :(得分:13)

您可以使用以下模式验证非拉丁字符:

preg_match ('/^[a-zA-Z\p{Cyrillic}\d\s\-]+$/u', $str);

有关完整说明,请参阅this post

答案 1 :(得分:4)

匹配西里尔字母和普通字符的更好解决方案是:

preg_match ('/^[\p{Cyrillic}\p{Common}]+$/u', $str);

答案 2 :(得分:2)

这看起来像utf-8,如果是,来自php.net的cebelab的这个提示可能会有所帮助:

  

我注意到为了处理   UTF-8文本,无需   使用PCRE UTF-8标志重新编译php   启用后,您只需添加即可   按顺序开始   你的模式:(* UTF8)

     

例如:'#(* UTF8)[[:alnum:]]#'   将为'é'返回TRUE   '#[[:alnum:]]#'将返回FALSE

使用内置特殊字符组:alnum:为此,您需要撤消匹配:

function validate_city($field) {
    if ($field == "") return "Enter city.<br />";
    else if (preg_match("/(*UTF8)^[[:alnum:]]+$/", $field))
    return "";
    return "City hame only from letters and -.<br />";
} 
编辑,啊,在正则表达式中忘了utf-8; )

答案 3 :(得分:0)

是的,这是一个编码问题 把它放在你的页面中:

<META http-equiv="Content-Type" content='text/html;charset="UTF-8"'>

或者这个:

<META http-equiv="Content-Type" content='text/html;charset="windows-1251"'>

答案 4 :(得分:0)

您必须确保所有文件在相应位置具有相同的编码或编码/解码数据。如果你正在使用utf-8,请检查: - 您的页面以正确的编码方式显示(浏览器 - &gt;视图 - &gt;编码) - 您的文件具有正确的编码

您的数据库(如果有的话)也应该与您在其他地方选择的编码相同。

答案 5 :(得分:0)

检查响应标头中的编码(FireBug是一个很棒的工具)。可能您在Webserver配置中的值不正确(例如,.htaccess文件中的AddDefaultCharset)。

PS。使用UTF regexp而不是字符范围(preg_match("/[^\pL-]/u", $field)

答案 6 :(得分:0)

变量$_POST['city']如下所示:Ð�инÑ�к

这不是UTF-8 ....也许问题出现在$_POST