2010-07-07 88 views
0

我目前使用这一段代码通过去除,以减少给定文本到一个有效的“标签”格式(仅小写,AZ和减去允许)/替换无效字符优化“标记”的正则表达式

 $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 

不限提示如何把至少正则表达式放入一个单一的?

感谢您的任何建议!

+0

为什么不会$ zip_filename = preg_replace(“/ [^ a-zA-Z \ - ]/g”,'',$ zip_filename); //用无效 工作替换无效字符? – murgatroid99 2010-07-07 20:57:26

回答

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

说明:

  1. A-Z是无用的,因为它应该是小写
  2. 右支架后添加+将替换一个或多个连续的无效字符
  3. 使用trim与第二个参数 - 字符以修剪形式开始和结束将加快代码
  4. 删除\-preg_replace也将采取连字符之间的连字符之间的连字符汽车,将其替换为单个连字符。
+0

这并不考虑多个连续的连字符,我不这么认为。 – 2010-07-07 21:16:58

+0

@铂金 - 你说得对。它也不会处理连续的空格,或者前导或尾部破折号。 – 2010-07-07 21:20:07

+0

白金是正确的。 0ßDie - S§$“%idsfg SDG $ 将导致 模 - S-idsfg-SDG (一个连字符太多) – Nogga 2010-07-07 21:20:41

0

这应该简化它大大...

$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); 

(最后这一步操作不能真正地与其他因为您使用的是不同的替换字符串相结合。)

0

你通过将这四个操作合并为一个,只会使代码更难理解/维护。

您也不需要基于正则表达式的操作的复杂性和性能,以实现您所需的操作。

的双单减号的减少可以与环状呼叫可以更容易地实现到str_replace函数:

while (substr_count($zip_filename, '--')) { 
    $zip_filename = str_replace('--', '-', $zip_filename); 
} 

包装这个向上以良好命名的类的方法将抽象掉任何明显的复杂性和帮助代码的可读性。

最后两个操作可以通过trim()函数处理:

$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, '-');