正则表达式 - 为什么这不能确保变量有一些文本?

I have been looking around and googling about regex and I came up with this to make sure some variable has letters in it (and nothing else).

/^[a-zA-Z]*$/

In my mind ^ denotes the start of the string, the token [a-zA-Z] should in my mind make sure only letters are allowed. The star should match everything in the token, and the $-sign denotes the end of the string I'm trying to match.

But it doesn't work, when I try it on regexr it doesn't work sadly. What's the correct way to do it then? I would also like to allow hyphen and spaces, but figured just starting with letters are good enough to start with and expand.

Short answer : this is what you are looking for.

/^[a-zA-Z]+$/

The star * quantifier means "zero or more", meaning your regexp will match everytime even with an empty string as subject. You need the + quantifier instead (meaning "one or more") to achieve what you need.

If you also want to match at least one character which could also be a whitespace or a hyphen you could add those to your character class ^[A-Za-z -]+$ using the plus + sign for the repetition.

If you want to use preg_match to match at least one character which can contain an upper or lowercase character, you could shorten your pattern to ^[a-z]+$ and use the i modifier to make the regex case insensitive. To also match a hyphen and a whitespace, this could look like ^[a-z -]+$

For example:

$strings = [
    "TeSt",
    "Te s-t",
    "",
    "Te4St"
];
foreach ($strings as $string) {
    if(preg_match('#^[a-z -]+$#i', $string, $matches)){
        echo $matches[0] . PHP_EOL;
    }
}

That would result in:

TeSt

Te s-t

Output php