1

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.

Aniket Sahrawat
  • 12,410
  • 3
  • 41
  • 67
PEREZje
  • 2,272
  • 3
  • 9
  • 23
  • Possible duplicate of [Regex to match only letters](https://stackoverflow.com/questions/3617797/regex-to-match-only-letters) – mickmackusa Jan 22 '18 at 00:29

2 Answers2

3

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.

Calimero
  • 4,238
  • 1
  • 23
  • 34
1

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

The fourth bird
  • 154,723
  • 16
  • 55
  • 70