3

文字列が2つ以上の単語を含み、各単語が2つ以上の文字を持っていることを検出/検証する関数を作成したい(2つの文字を除いて、{数字なし}の他の文字を含めることができますが、私はしませんどれといくつか気になります)。

現在、これに正規表現を使用する必要があるのか​​、それとも他の方法で使用できるのかわかりません。

正規表現を作成する必要がある場合、利用可能なすべての文字を確認する必要があるため、その方法もわかりません。

これは私が今得た正規表現であり[A-Za-z]{2,}(\s[A-Za-z]{2,})、少なくとも各単語で2つの単語と2つの文字を検証します。

編集:kr-jp-cn言語は他の言語とは動作が異なるため、再考した後、ほとんどの言語をサポートすることにしました。私の主なルールでは、kr-jp-cnの文字は文字としてではなく、文字としてカウントされます。

EDIT2:

これは、@messageanswerに基づいて使用している関数です。

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

私も正規表現を使用します

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 に答える
2

Unicode 文字プロパティを使用します。

\p{L}または\p{Letter}任意の言語の文字プロパティを持つコード ポイントを照合します。Unicode 文字プロパティに関する php.net ドキュメント

于 2012-07-30T16:54:31.853 に答える
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 に答える