PHP:正则表达式匹配字符串前面没有数字或空格

时间:2011-07-20 08:10:57

标签: php regex string numbers ignore

我一直在尝试检查一个字符串值是否以数值或空格开头并相应地采取行动,但它似乎没有起作用。这是我的代码:

private static function ParseGamertag( $gamertag )
{

    $safetag = preg_replace( "/[^a-zA-Z0-9\s]+/", "", $gamertag ); // Remove all illegal characters : works
    $safetag = preg_replace( "/[\s]+/", "\s", $safetag ); // Replace all 1 or more space characters with only 1 space : works
    $safetag = preg_replace( "/\s/", "%20", $safetag ); // Encode the space characters : works

    if ( preg_match( "/[^\d\s][a-zA-Z0-9\s]*/", $safetag ) ) // Match a string that does not start with numerical value : not working
        return ( $safetag );
    else
        return ( null );

}

因此hiphop112有效但112hiphip无效。 0down无效。

第一个字符是字母字符[a-zA-Z]

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:4)

您需要使用锚点^

将模式锚定到字符串的开头
preg_match( "/^[^\d\s][a-zA-Z0-9\s]*/", $safetag )

否则你的正则表达式会在字符串

中找到一个有效的匹配

您可以找到锚here on regular-expressions.info

的解释

请注意^的不同含义。在字符类之外,它是字符串开头的锚点,在第一个位置的字符类中,它是类的否定。

答案 1 :(得分:3)

尝试添加^以表示字符串的开头...

preg_match( "/^[^\d\s][a-zA-Z0-9\s]*/", $safetag )

另外,如果第一个字符必须是字母,这可能会更好:

preg_match( "/^[a-zA-Z][a-zA-Z0-9\s]*/", $safetag )

答案 2 :(得分:2)

使用^标记字符串的开头(尽管^中的[ ]表示不是)。

您也可以使用\w代替a-zA-Z0-9

/^[^\d\s][\w\s]*/

答案 3 :(得分:1)

在正则表达式的开头添加“以胡萝卜开头”:

/^[^\d\s][a-zA-Z0-9\s]*/

答案 4 :(得分:1)

首先,没有任何内容可以匹配,因为你用%20替换了所有空格。

为什么不积极匹配:

[a-zA-Z][a-zA-Z0-9\s]*

答案 5 :(得分:0)

preg_match( "/^[a-zA-Z]+[a-zA-Z0-9\s]*/", $safetag ) )