0

我想我知道下面在做什么,但不想做出任何假设以确保..

正则表达式是:

$value = preg_replace(array('/[^a-z0-9_ -]/', '/[ -]+/', '/^-|-$/'), array('', '-', ''), $str);

数组的第一部分很简单,除了 az、0-9、下划线、空格和连字符之外什么都没有。虽然空格后的连字符不应该被转义吗?

第二部分我不太确定......我认为它是说用一个连字符替换一个或多个空格或一个或多个连字符?我对吗?但是,再次避开连字符?

第三部分有点令人困惑......|正则表达式中的字符不是OR运算符吗?那么用什么替换连字符或连字符?如果|被转义了,那么我会读取它,因为整个字符串需要匹配-|-并将其替换为空?

最后......我的想法是否正确,它可以在获得它们的位置处理替换?所以它会首先处理数组中的第一个点,然后用字符串的剩余部分移动到第二个和第三个;因此,例如,如果第一个替换替换了某些东西,那么第二个替换将适用于字符串的修订版本?

4

3 回答 3

1

第一次替换后,字符串将只有字母、数字、空格、下划线和连字符。第二次替换会将所有连续的空格和/或连字符变成一个连字符,第三次替换将删除字符串开头或结尾的连字符。

其他的建议:

  • 如果您将连字符放在字符类的开头或结尾,则不需要对字符类中的连字符进行转义。
  • 第三个正则表达式/^-|-$/具有锚点^$,分别表示字符串的开头和字符串的结尾,因此此正则表达式将匹配单个连字符,但前提是它位于字符串的开头或结尾。
于 2012-10-31T19:04:33.207 回答
1

如果连字符位于字符串的末尾或开头,则不需要转义。

第二部分匹配任何连续的空格或连字符(即使它们是混合的)。

第三部分匹配字符串开头的连字符 ( ^-) 或字符串结尾的连字符 ( -$)。

这一切加在一起是删除所有不是字母、数字、下划线、空格或连字符的字符。然后将所有连续的空格和连字符收缩为一个连字符。最后删除前导或尾随连字符。

于 2012-10-31T19:05:10.880 回答
0
  1. 删除除字母数字字符、空格_-
  2. 替换连续空格或-仅替换一个-
  3. 删除前导和尾随-

正如@nickb所说,连字符不需要转义,只要它不在由分隔的一组字符中[]

于 2012-10-31T19:05:00.037 回答