Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 - Fatal编程技术网

Php “优化”;标记";正则表达式

Php “优化”;标记";正则表达式,php,regex,Php,Regex,我目前使用这段代码,通过删除/替换无效字符,将给定文本缩减为有效的“标记”格式(只允许小写、a-z和减号) $zip_filename = strtolower($original); $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', $zip_filename); //replace invalid chars $zip_filename = preg_replace("/-+/g", '-'

我目前使用这段代码,通过删除/替换无效字符,将给定文本缩减为有效的“标记”格式(只允许小写、a-z和减号)

        $zip_filename = strtolower($original);
        $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', $zip_filename); //replace invalid chars
        $zip_filename = preg_replace("/-+/g", '-', $zip_filename); // reduce consecutive minus to only one
        $zip_filename = preg_replace("/^-/g", '', $zip_filename); // removing leading minus
        $zip_filename = preg_replace("/-$/g", '', $zip_filename); // remove trailing minus
有没有关于如何将正则表达式至少放入一个正则表达式的提示

谢谢你的建议

$zip_filename = trim(preg_replace("/[^a-z]+/", '-', $zip_filename),'-');
说明:

  • A-Z
    是无用的,因为它应该是小写的
  • 在右括号后添加
    +
    将替换一个或多个连续的无效字符
  • 使用
    trim
    和第二个参数-字符来修剪表单的开头和结尾将加快代码的速度
  • preg\u replace
    中删除
    \-
    也将占用无效字符/多个连续连字符之间的连字符,并将它们替换为单个连字符
  • 说明:

  • A-Z
    是无用的,因为它应该是小写的
  • 在右括号后添加
    +
    将替换一个或多个连续的无效字符
  • 使用
    trim
    和第二个参数-字符来修剪表单的开头和结尾将加快代码的速度
  • preg\u replace
    中删除
    \-
    也将占用无效字符/多个连续连字符之间的连字符,并将它们替换为单个连字符

  • 这将大大简化它

    $zip_filename = trim(strtolower($original));
    $zip_filename = preg_replace("/\s\s+|--+|[^a-zA-Z-]/g", '-', $zip_filename);
    
    trim
    将处理字符串前后的空格。还要注意
    \s\s+
    -->
    。它们在查找重复项方面更有效。如果连续有2个或更多字符,它们将只匹配这些字符,因此避免了不必要的替换操作

    但从技术上讲,它仍然可以有前导或尾随破折号。为此,你仍然需要这个

    $zip_filename = preg_replace("/^-|-$/g", '', $zip_filename);
    

    (由于您使用的是不同的替换字符串,最后一个操作实际上无法与另一个操作组合。)

    这将大大简化它

    $zip_filename = trim(strtolower($original));
    $zip_filename = preg_replace("/\s\s+|--+|[^a-zA-Z-]/g", '-', $zip_filename);
    
    trim
    将处理字符串前后的空格。还要注意
    \s\s+
    -->
    。它们在查找重复项方面更有效。如果连续有2个或更多字符,它们将只匹配这些字符,因此避免了不必要的替换操作

    但从技术上讲,它仍然可以有前导或尾随破折号。为此,你仍然需要这个

    $zip_filename = preg_replace("/^-|-$/g", '', $zip_filename);
    

    (由于您使用的是不同的替换字符串,最后一个操作实际上无法与另一个操作组合。)

    将这四个操作组合成一个操作,只会使代码更难理解/维护

    您也不需要基于正则表达式的操作的复杂性和性能影响来实现所需的功能

    通过循环调用stru_replace,可以更容易地将双减号减少为单减号:

    while (substr_count($zip_filename, '--')) {
        $zip_filename = str_replace('--', '-', $zip_filename);
    }
    
    将其包装在一个命名良好的类方法中,将抽象掉任何明显的复杂性,并有助于代码的可读性

    最后两个操作可由函数处理:

    $zip_filename = trim($zip_filename, '-');
    
    然后,您可以用cpu攻击性较小且更易于他人理解的操作替换基于正则表达式的操作:

    //replace invalid chars
    $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', strtolower($original)); 
    
    // reduce consecutive minus to only one
    while (substr_count($zip_filename, '--')) {
        $zip_filename = str_replace('--', '-', $zip_filename);
    }
    
    // remove leading and trailing minus
    $zip_filename = trim($zip_filename, '-'); 
    

    将这四个操作组合成一个操作,只会使代码更难理解/维护

    您也不需要基于正则表达式的操作的复杂性和性能影响来实现所需的功能

    通过循环调用stru_replace,可以更容易地将双减号减少为单减号:

    while (substr_count($zip_filename, '--')) {
        $zip_filename = str_replace('--', '-', $zip_filename);
    }
    
    将其包装在一个命名良好的类方法中,将抽象掉任何明显的复杂性,并有助于代码的可读性

    最后两个操作可由函数处理:

    $zip_filename = trim($zip_filename, '-');
    
    然后,您可以用cpu攻击性较小且更易于他人理解的操作替换基于正则表达式的操作:

    //replace invalid chars
    $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', strtolower($original)); 
    
    // reduce consecutive minus to only one
    while (substr_count($zip_filename, '--')) {
        $zip_filename = str_replace('--', '-', $zip_filename);
    }
    
    // remove leading and trailing minus
    $zip_filename = trim($zip_filename, '-'); 
    

    为什么$zip\u filename=preg\u不替换(“/[^a-zA-Z\-]/g”,”,“$zip\u filename”)//用无效字符替换无效字符?为什么$zip_filename=preg_不替换(“/[^a-zA-Z \-]/g”,“”,$zip_filename)//用无效字符替换无效字符?我认为这不能处理多个连续连字符。@Platinum-你说得对。它也不考虑连续空格、前导破折号或尾随破折号。白金是正确的。0ßDie--s§$“%&idsfg sdg$将导致Die--s-idsfg-sdg(多了一个连字符)啊,我比我现在更喜欢这个,特别是因为我不是php爱好者,也不知道trim函数的可选参数。我确实认为您需要对空格执行一次修剪。原始代码有效地消除了前导空格和尾随空格…我认为这是您现在唯一没有做的事情。不管怎样,您可以忽略这一点。你正在用破折号替换空格,然后修剪破折号。这是一个有点冗余的处理,但一点也不糟糕,而且非常容易查看。我认为这不包括多个连续连字符。@Platinum-你说得对。它也不包括连续空格,或前导或尾随破折号。Platinum是对的。0ßDie--s§$“%&idsfg sdg$将导致Die--s-idsfg-sdg(一个连字符太多)啊,我比我现在更喜欢这个,特别是因为我不是php爱好者,也不知道trim函数的可选参数。我认为您需要对空间再进行一次修剪。原始代码有效地消除了前导空格和尾随空格。。。我想这是你现在唯一不做的事。没关系,你可以忽略这一点。您将用破折号替换空格,然后修剪破折号。这是一个有点冗余的处理,但一点也不差,而且非常容易查看。