需要有关硬正则表达式的帮助

时间:2010-01-17 12:40:32

标签: php regex capitalization

我需要一个正则表达式来检查一个字符串是否只包含字母(az),并且第一个字母是大写的,你不能在一个单词大写中有2个字母喜欢:THomas或THOMAS但Thomas Anderson(托马斯安德森)也是有效

外观:

The Magician Of The Elfs有效,但不是ThE MaGiCiAN oF ThE ELFS

if (!preg_match("??", $name)) {
   echo "Invalid name!";
}
希望你理解!

托马斯

无效:

MaGIciaN Of The ELFz
THomas anderson

有效:

Magician of the elfs
Magician Of the Elfs
Magician of The elfs
Thomas Anderson
Thomas anderson

基本上我不希望一个单词中有超过1个大写字母,而不是句子。

5 个答案:

答案 0 :(得分:5)

'/^[A-Z][a-z]+( [A-Z][a-z]+)*$/'

但未经测试。

编辑哦,也许我误解了你的问题。以上假设最小字长为2。 “John A”或“A Horse”有效吗?在这种情况下:'/^[A-Z][a-z]*( [A-Z][a-z]*)*$/'


根据更新的要求:

'/^[A-Z][a-z]*( [A-Za-z][a-z]*)*$/'

验证一个大写字母,后跟任意数量的小写字母。在此之后,任意数量的序列:空格(可能是大写字母),任意数量的小写字母(每个空格至少有一个字母)。

答案 1 :(得分:3)

您还可以通过Unicode character properties

来描述角色
/^\p{Lu}\p{Ll}*(?:\s+\p{Lu}\p{Ll}*)*$/

修改由于您更改了要求,请尝试使用以下正则表达式:

/^[\p{Lu}\p{Ll}]\p{Ll}*(?:\s+[\p{Lu}\p{Ll}]\p{Ll}*)*$/

现在第一个字符或每个单词可以是大写字母或小写字母。

答案 2 :(得分:1)

$str = "ThE MaGiCiAN oF ThE ELFS";
$s = explode(" ",$str);
foreach ($s as $k){
    if ( ! (preg_match("/^[A-Z][a-z]+/",$k) )){
        print "$str does not match.\n";
        break;
    }
}

答案 3 :(得分:0)

哇。 \b,伙计。

if matches /\B[A-Z]/ then invalid

或者,要知道Unicode,

if matches /\B\p{Lu}/ then invalid

您可能希望首先确保整个字符串与/^[\p{Lu}\p{Ll}\s]$/匹配,以避免将The (Magic) Elf之类的字符串保留为有效字段。

答案 4 :(得分:0)

if (preg_match("\w[A-Z]", $name)) {
    echo "invalid name!";
}