Codeigniter表单验证 - 使用正则表达式自定义回调,允许重音

时间:2013-06-20 14:10:20

标签: php regex codeigniter preg-match

在任何人开火之前,我想说我已经尝试了所有解决方案,以及谷歌,但没有任何作用:(。我需要一些启示:)

这是我的自定义form_validation回调函数。

代码段

function _check_valid_text($text_string)
{
    if(empty($text_string)) return TRUE;
    if(!preg_match("/^[\pL\pN_ \w \-.,()\n]+$/i", $text_string))
    {
        // Set the error message:
        $this->form_validation->set_message('_check_valid_text', 'Invalid Character or symbol');
        return FALSE;
    }
    return TRUE;
}

我想要什么:

  1. 允许所有字母数字字符[a-z,A-Z& 0-9]
  2. 允许重音
  3. 允许以下内容:空格,开括号,近括号,短划线,句号和逗号
  4. 奇怪

    für有效,即没有错误(YAY!)。 trägen没有:(

    有人可以告诉我哪里出错了吗?

    PS:请不要提供解决方案,解决方案是将未被识别的字符包含在preg_match字符串中(例如将ä添加到字符串中)。我正在寻找一种有效的通用解决方案。

    PPS 我想向社区提出建议。对于各种案件,library of regex expressions怎么样?一个人可以写一个正则表达式,一旦其他人验证它正在工作,它就可以被接受。只是一个建议。我认为像我这样的新人在regex-hell:{/ p>>中遇到了很多困难

2 个答案:

答案 0 :(得分:2)

您必须添加 u 修饰符以通知正则表达式引擎必须将您的字符串视为unicode字符串。另请注意,您可以减少角色类,例如:

$subjects = array('Wer nur den lieben Gott läßt walten',
                  'Sei gegrüßet Jesu gütig',
                  'Komm, Gott, Schöpfer, Heiliger Geist',
                  '←↑→↓');

$pattern = '~^[\pL\pN\s,.()_-]++$~u';

foreach ($subjects as $subject) {
    if (preg_match($pattern, $subject, $match))
        echo '<br/>True';
    else
        echo '<br/>false';
}

答案 1 :(得分:0)

没有通用的解决方案可以解决这个问题,因为不存在满足您需求的预定义字符集。

但是,您可以添加重音字符范围。

[ ,-\.0-9A-Za-z\{\}À-ž]

另外,有关与特定字符集匹配的信息,请参阅How to allow utf-8 charset in preg_match?