如何在PHP中编写正则表达式来验证中间名首字母

6qfn3psc  于 10个月前  发布在  PHP
关注(0)|答案(2)|浏览(65)

如何写一个正则表达式来验证PHP中的中间名。因为有些人有不止一个中间名首字母,正则表达式应该允许在一个和三个中间名首字母之间。正则表达式应该允许一个字母带或不带句点,两个或三个字母后面各带一个句点,或者两个或三个字母后面各带一个句点和一个空格。
以下是允许的字符串列表,其中“A”表示任何大写或小写字母,包括外国字母表中的unicode字母:

'A', 'A.', 'A.A.', 'A. A.', 'A.A.A.', 'A. A. A.'

字符串
下面是我编写的一个正则表达式,它可以作为起点来验证英文字母表中的一个midlle首字母,后面跟着一个可选的句号。

$pattern = "/^([a-zA-Z]{1}[\.]{0,1})?$/";    
preg_match_all($pattern, $input_string, $match) > 0;

ukxgm1gy

ukxgm1gy1#

好了,我们将在整个字符串中有两种匹配。

  • A. A. A.模式,其中每个字符后面都有一个.
  • A A A模式,其中每个字符后面都有空格,而不是句点字符。

经您确认,根据您的要求,A. A A.不是有效模式。所以,我们不会关注它。
就regex而言,它将如下所示,

  • \p{L}\.\s*匹配A. A. A.模式。\p{L}用于匹配单个Unicode代码点。
  • \p{L}\s*匹配A A A模式。

总的来说,正则表达式将是/^((\p{L}\.\s*)+|(\p{L}\s*)+)$/iu|用于指示替代匹配。因此,它可能是第一个捕获组或第二个。u标志用于将主题字符串和模式视为UTF-8。(see more info

片段:

<?php

$tests = [
    'A',
    'A.',
    'A.A.',
    'A. A.',
    'A. A. A.',
    'A. A',
    'A. A A.',
    'A A. A.',
    'Ω.',
    'A.Ω.',
    'Ω',
    'A Ω.',
];

foreach($tests as $test){
    echo $test," => ", var_dump(preg_match('/^((\p{L}\.\s*)+|(\p{L}\s*)+)$/ui', $test) === 1), PHP_EOL;
}

字符串
Live Demo
为了只匹配123首字母的长度,我们可以将+量词更改为{1,3}以匹配编号。在1 - 3的范围内的首字母。

/^((\p{L}\.\s*){1,3}|(\p{L}\s*){1,3})$/ui


Live Demo

h4cxqtbf

h4cxqtbf2#

我想这在很大程度上取决于您定义的有效名称。EG?

<?php

    $names = ['Bill', 'Bill.', 'Bill.Smith.', 'Bill. Smith.', 'Bill.B.Smith.', 'Bill. B. Smith.', 'Bill B Smith', 'Bill Smith'];

    $pattern = '/(?:[A-Za-zА-Яа-яΑ-Ωα-ω]\.\s?|[A-Za-zА-Яа-яΑ-Ωα-ω]{2,3}\.\s?|\s[A-Za-zА-Яа-яΑ-Ωα-ω]\s)/u';
    foreach( $names as $name ){
        if( preg_match_all($pattern, $name, $match) ){
            echo "$name is valid\n";
        } else {
            echo "$name is invalid\n";
        }
    }

字符串
结果将是:

Bill is invalid
Bill. is valid
Bill.Smith. is valid
Bill. Smith. is valid
Bill.B.Smith. is valid
Bill. B. Smith. is valid
Bill B Smith is valid
Bill Smith is invalid

相关问题