Re: preg_match problem

From: Date: Mon, 22 Jan 2007 23:58:28 +0000
Subject: Re: preg_match problem
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-247584@lists.php.net to get a copy of this message
At 1/22/2007 03:04 PM, Beauford wrote:
I'm trying to get this but not quite there. I want to allow the following characters. A-Za-z0-9!@#$%&()*;:_.'/\ and a space. Is there a special order these need to be in or escaped somehow. For example, if I just allow _' the ' is fine, if I add the other characters, the ' gets preceded by a \ and an error is returned. If I take the ' out of the sting below it works fine, I get no errors returned. I am also using stripslashes on the variable. This is my code. (although I have tried various things with it trying to get it right) if(preg_match("/^[-A-Za-z0-9!@#%&\(\)\*;:_.\'\$ ]+$/", $string)) {
Please read this page: Pattern Syntax -- Describes PCRE regex syntax http://ca.php.net/manual/en/reference.pcre.pattern.syntax.php specifically the section on character classes: http://ca.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference.squarebrackets In PREG there are few characters that you need to escape in a character class expression: 1) ^ must be escaped (\^) if it's the first character (it negates the match when it's unescaped in the first position). 2) ] must be escaped (\]) unless it's the first character of the class (it closes the class if it appears later and is not escaped). 3) \ must be escaped (\\) if you're referring to the backslash character rather than using backslash to escape another character. 4) Control codes such as \b for backspace (not to be confused with \b which means word boundary outside of a character class). In addition, you may need to escape certain characters in PHP if you're expressing the RegExp pattern in a quoted string, such as single or double quotes (whichever you're using to quote the pattern):
        '[\'"]'  escape the apostophe
        "['\"]"  escape the quotation mark
Those are PHP escapes -- by the time PREG sees the pattern, the PHP compiler has rendered it to:
        ['"]
And then of course there's the complication that both PREG and PHP use the backslash as the escape character, so the pattern:
        [\\]  escape the backslash
must be expressed in PHP as:
        [\\\\]          escape the escape and the backslash
Interestingly, PHP compiles both \\\ and \\\\ as \\, go figure. I use \\\\ to escape both backslashes to maintain some semblance of logic and order in these eye-crossing expressions. Because PHP requires quotes to be escaped, I find it easier to write & debug patterns in PHP if I express them in heredoc where quoting and most escaping is unnecessary: $sPattern = <<<_ ['"\\\\] _; becomes the PREG pattern ['"\\]. So to address your character class:
A-Za-z0-9!@#$%&()*;:_.'/\ and a space.
I'd use the pattern:
        [A-Za-z0-9!@#$%&()*;:_.'/\\ ]
where the only character I need to escape is the backslash itself. In PHP this would be:
        $sPattern = '[A-Za-z0-9!@#$%&()*;:_.\'/\\\\ ]';
        (escaped apostrophe & blackslash)
or:
        $sPattern = "[A-Za-z0-9!@#$%&()*;:_.'/\\\\ ]";
        (escaped blackslash)
or:
        $sPattern = <<<_
[A-Za-z0-9!@#$%&()*;:_.'/\\\\ ] _;
        (escaped blackslash)
Regards, Paul __________________________ Juniper Webcraft Ltd. http://juniperwebcraft.com

« previous php.general (#247584) next »