检测字符串是否包含至少2个字母(形成任何语言)和至少2个单词

时间:2012-07-30 16:46:10

标签: php regex utf-8 multibyte

我想制作检测/验证字符串至少有2个字的函数,每个字至少有2个字母(除了两个字母,它可以包含任何其他字符{没有数字},但我不关心哪个和多少个。)

现在,我不确定是否应该使用正则表达式,或者我可以通过其他方式使用正则表达式。

如果我需要为它制作正则表达式,我也不知道该怎么做,因为我需要检查所有可用的字母。

这是我现在获得的正则表达式[A-Za-z]{2,}(\s[A-Za-z]{2,}),它至少在每个单词中验证了2个单词和2个字母。

修改: 在重新思考之后,我决定支持大多数语言,因为kr-jp-cn语言与其他语言的工作方式不同。我的主要规则不会让kr-jp-cn字母计为字母而是字母。

EDIT2:

这是我根据@message回答使用的功能。

function validateName($name)
{
    if (strcspn($name, '0123456789') == strlen($name)) //return the part of the string that dont contain numbers and check if equal to it length - if it equal than there are no digits - 80% faster than regex.
    {
        $parts = array_filter(explode(' ',$name)); //should be faster than regex which replace multiple spaces by single one and then explodes.
        $partsCount = count($parts);
        if ($partsCount >= 2)
        {
            $counter = 0;
            foreach ($parts as $part)
            {
                preg_match_all('/\pL/u', $part, $matches);

                if (count($matches[0]) >= 2)
                {
                    $counter++;
                }
            }
        }

        if ($counter == $partsCount)
        {
            return 'matches';
        }
    }

    return 'doesnt match';
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

使用Unicode character properties

\p{L}\p{Letter}将代码点与任何语言的Letter属性相匹配。 php.net documentation on Unicode character properties

答案 1 :(得分:2)

我也会使用正则表达式

preg_match('/\w{2,}\s+\w{2,}/u', 'word слово');

\w{2,}匹配单词字符2或更多。 \s+匹配之间的所有空格 并使用/u unicode modifier

编辑:

我认为这样的解决方案会有所帮助,但你需要更复杂的东西,比如

$text = preg_replace('/\s+/', ' ', 'word w.s');

$parts = explode(' ', $text, 2);
if (count($parts) < 2) {
    throw new \RuntimeException('Should have more than two words');
}

foreach ($parts as $part) {

    preg_match_all('/\w/u', $part, $matches);

    if (count($matches[0]) < 2) {
        throw new \RuntimeException('Should have more than two letters in word');
    }
}

答案 2 :(得分:0)

如果您尝试使用字符串中的这些单词,那么正则表达式不是可行的方法。正则表达式不是解析器。我可以看到这样做的最佳方式是explode()ctype_alpha()的组合。

的内容
$prepstring = $string;

//Remove all spaces from the original string and check that everything is a char
if(ctype_alpha(str_replace(array(' '), '', $prepstring))){

  //If everything is a char explode your string into an array
  explode($string);

  if(isset($string[1])){
    //Everything checks out, do something here.
  }

}