Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这个正则表达式在做什么?数组中的替换方法是什么_Php_Regex_Preg Replace - Fatal编程技术网

Php 这个正则表达式在做什么?数组中的替换方法是什么

Php 这个正则表达式在做什么?数组中的替换方法是什么,php,regex,preg-replace,Php,Regex,Preg Replace,我想我知道下面的内容,但我不想做任何假设,我想确保 正则表达式是: $value = preg_replace(array('/[^a-z0-9_ -]/', '/[ -]+/', '/^-|-$/'), array('', '-', ''), $str); 数组中的第一部分很简单,除了a-z、0-9、下划线、空格和连字符外,它什么都不替换。但是空格后的连字符不应该转义吗 第二部分我不太确定。。。。我想它是说用一个连字符替换一个或多个空格或一个或多个连字符?我说得对吗?但还是要避开连字符 第三

我想我知道下面的内容,但我不想做任何假设,我想确保

正则表达式是:

$value = preg_replace(array('/[^a-z0-9_ -]/', '/[ -]+/', '/^-|-$/'), array('', '-', ''), $str);
数组中的第一部分很简单,除了a-z、0-9、下划线、空格和连字符外,它什么都不替换。但是空格后的连字符不应该转义吗

第二部分我不太确定。。。。我想它是说用一个连字符替换一个或多个空格或一个或多个连字符?我说得对吗?但还是要避开连字符

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


最后。。。。。我的想法是正确的,它在它得到的位置处理替换?所以它会先处理数组中的第一个点,然后用剩下的字符串移动到第二个和第三个点;因此,例如,如果第一次替换替换了某个内容,那么第二次替换将对字符串的修订版本起作用?

在第一次替换之后,字符串将只包含字母、数字、空格、下划线和连字符。第二次替换将把所有连续的空格和/或连字符转换为一个连字符,第三次替换将删除字符串开头或结尾的连字符

其他意见:

  • 如果将连字符放在字符类的开头或结尾,则不需要对字符类中的连字符进行转义
  • 第三个正则表达式
    /^-|-$/
    具有锚点
    ^
    $
    ,分别表示字符串的开头和结尾,因此此正则表达式将匹配单个连字符,但仅当它位于字符串的开头或结尾时
  • 删除除字母数字字符、空格、
    \uuu
    -
  • 将连续空格或
    -
    仅替换为一个
    -
  • 删除前导和尾随
    -

  • 正如@nickb所说,只要连字符不在由
    []

    分隔的一组字符中,连字符就不需要转义,如果它位于字符串的末尾或开头

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

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


    这样做的目的是删除所有不是字母、数字、下划线、空格或连字符的字符。然后将所有连续的空格和连字符压缩为一个连字符。最后删除前导或尾随连字符。

    连字符不需要转义,因为它位于字符类的末尾(
    []
    )-如果它位于开头或结尾,则不需要转义。看起来像是用于创建slug的正则表达式。@nickb啊,好的,我不知道。谢谢@是的,这是它的一部分令人惊叹的。谢谢我是否可以用
    /[\s-]+/
    替换第二个,以同时捕获选项卡?@Brett是的,使用
    \s
    可以,但是如果不想同时捕获换行符,则应使用
    /[\t-]+/