3

在有人激怒我之前,我想说我已经在 SO 和 google 上尝试了所有解决方案,但没有任何效果:(。我需要一些启示:)

这是我的自定义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. 允许所有字母数字字符 [az, AZ & 0-9]
  2. 允许重音
  3. 也允许以下内容:空格、左大括号、右大括号、破折号、句点和逗号

奇怪的是

für有效,即没有错误(耶!)。 trägen才不是 :(

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

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

PPS我想向社区提出建议。library of regex expressions对于各种情况有一个怎么样?一个人可以编写一个正则表达式,一旦其他人验证它正在工作,它就可以被接受。不过只是一个建议。我认为这里有更多像我这样的新人,他们经常陷入困境regex-hell:)

4

2 回答 2

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';
}
于 2013-06-20T15:02:34.067 回答
0

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

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

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

另外,请参阅如何在 preg_match 中允许 utf-8 字符集?有关与特定字符集匹配的信息。

于 2013-06-20T14:35:29.897 回答