1

I'm trying to better understand regular expressions, but can't seem to understand this.

preg_replace("/[^a-zA-Z0-9.?!\s]/", "", $mystring);

I thought that this would not replace dashes, because it would be counted as "through" in the example above. But every time I run it, the dash is removed.

4

1 回答 1

5

You don't provide a sample $mystring value, which would be helpful.

As it is written, this regular expression will replace one, and only one, character in $mystring. Specifically, your character class includes a carat character (^) at the very beginning. In any Perl-compatible regular expression engine (of which PHP is one), this indicates not these things (see character classes for more). So your expression is essentially stripping anything that is not:

  • A lowercase letter between a and z
  • An uppercase letter between A and Z
  • A digit between 0 and 9
  • A period
  • A question mark
  • An exclamation mark
  • A whitespace character

The dash character is not one of the above, so it gets matched and replaced.

Your assumption about the "through"-ness of the dashes as you have written it are correct, however. The dash character is one of the 4 special characters in a character class, and it gets used to indicate a range of characters.

于 2013-02-17T03:27:13.703 回答