Regex to match ALL-CAPS words of a certain length

前端 未结 2 444
时光取名叫无心
时光取名叫无心 2021-01-18 11:26

I have a function which fixes capitalization for those naughty users that insist on making everything UPPERCASE!

I want my function to only be called when a string c

相关标签:
2条回答
  • 2021-01-18 12:30
    if (preg_match('/\b\p{L}*\p{Lu}{3}\p{L}*\b/u', $str)) {
        // Naughty user!
    }
    

    will match any word that contains at least three uppercase letters. It doesn't matter whether the word starts with an uppercase or lowercase letter, so it would match, for example iTUNES or StackOVERflow as complete words.

    If you want to restrict yourself to words that consist entirely of uppercase characters, three or more, then use

    if (preg_match('/\b\p{Lu}{3,}\b/u', $str)) {
        // Naughty user!
    }
    
    0 讨论(0)
  • 2021-01-18 12:30
    if (preg_match('/[A-Z]{3,}|\b[A-Z]\b/', $str)) {
        // Naughty user!
    }
    

    Let's look at that...

    [A-Z] // Character class from A-Z
    {3,} // 3 or more quantifier
    | // Logical or pipe
    \b // Word boundary
    [A-Z] // Character class from A-Z
    \b // Word boundary
    

    That may make it easier to understand :)

    This will match if between two word boundaries all capitals and/or if there are 3 uppercase letters in a row. Please clarify if that is what you want.

    Update

    You may want to decide what triggers a whole word with capitals. For example, this sentence would be considered naughty.

    I like apples.

    .. because of the I. Perhaps you want to put a quantifier there too, like {2,}. It depends on what the string will contain.

    0 讨论(0)
提交回复
热议问题