RE: [PHP] preg_match problem
| From: | Beauford | Date: | Tue, 23 Jan 2007 00:56:56 +0000 |
| Subject: | RE: [PHP] preg_match problem | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-247587@lists.php.net to get a copy of this message | ||
> -----Original Message-----
> From: Paul Novitski [mailto:paul@juniperwebcraft.com]
> Sent: January 22, 2007 6:58 PM
> To: PHP
> Subject: Re: [PHP] preg_match problem
>
> 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)
I've probably read 100 pages on this, and no matter what I try it doesn't
work. Including all of what you suggested above - is my PHP possessed?
if(preg_match("/^[A-Za-z0-9!@#$%&()*;:_.'/\\ ]+$/", $string)) { gives me
this error.
Warning: preg_match() [function.preg-match]: Unknown modifier '\' in
/constants.php on line 107
So if If you wouldn't mind, could you show me exactly what I need right from
the beginning and explain why it works.
i.e.
if(preg_match(what goes here", $string)) {
Echo "You got it";