3

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

现在,我不确定是否应该为此使用正则表达式,或者我可以通过其他方式来做到这一点。

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

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

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

编辑2:

这是我根据@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';
}

谢谢您的帮助。

4

3 回答 3

2

使用Unicode 字符属性

\p{L}\p{Letter}匹配任何语言的具有 Letter 属性的代码点。关于 Unicode 字符属性的 php.net 文档

于 2012-07-30T16:54:31.853 回答
2

我也会使用正则表达式

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

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

编辑:

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

$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');
    }
}
于 2012-07-30T16:58:42.463 回答
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.
  }

}
于 2012-07-30T16:57:58.387 回答