Php “优化”;标记";正则表达式
我目前使用这段代码,通过删除/替换无效字符,将给定文本缩减为有效的“标记”格式(只允许小写、a-z和减号)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", '-'
$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函数的可选参数。我认为您需要对空间再进行一次修剪。原始代码有效地消除了前导空格和尾随空格。。。我想这是你现在唯一不做的事。没关系,你可以忽略这一点。您将用破折号替换空格,然后修剪破折号。这是一个有点冗余的处理,但一点也不差,而且非常容易查看。