2011-03-10 98 views
3

我正在写一个小的CMS,我试图把一个标题变成一个带短划线的URL段落。我知道我需要做几件事,而且我已经掌握了所有的东西,但我不喜欢它。问题似乎是,如果最后有特殊字符,我需要在进入数据库之前将其删除。我唯一能想出来的方法是在一个声明中做2个preg_replace。所以它看起来是这样的:必须有一个更好的正则表达式

preg_replace("/\-$/","",preg_replace('/[^a-z0-9]+/i', "-", strtolower($title))); 

,它并把这种:(this is a title!!!)))**that is (strange))

这个:this-is-a-title-that-is-strange

但这种表达只是看起来像驴。必须有更好的编码方式,或者其他的东西,我只是不知道。任何帮助将不胜感激

+1

请注意,对于以无效字符开头的标题,您可能还需要删除'/^- + /'。另外,如果你的第一个正则表达式是'/ - + $ /'来删除多个破折号? – 2011-03-10 04:30:25

+1

可能有一种方法可以将命令缩减为单个函数调用,但您现在拥有的方式是可读可读的,单功能版本不太可能是这些东西。 – 2011-03-10 04:31:34

+0

@Brad:他仍然需要将字符串中的字母小写,即使进行了修改。 – 2011-03-10 04:31:58

回答

4

您可以只需一个电话到preg-replace与阵列输入为:

preg_replace(array('/[^a-z0-9]+/','/^-|-$/'), // from array 
       array('-',''),     // to array 
       strtolower($title));    

请注意,您的现有代码保持领先-如果有的话。上面的代码摆脱了这一点。

+0

这是否按顺序替换正则表达式? from数组中的第二个替换取决于第一个已经完成的替换。 – 2011-03-10 04:37:32

+0

@Jeremiah Willcock:是的。替换依次发生。第二个是在第一个之后应用的。 – codaddict 2011-03-10 04:38:57

0

一个选项,它仍然需要两个替代,但需要同时兼顾的开始和结束短线的一个传球,就是:

preg_replace('/[^a-z0-9]/', '', 
    preg_replace('/([a-z0-9])[^a-z0-9]+([a-z0-9])/', '$1-$2', 
    strtolower($title))); 

还有的选择:

implode('-', 
    preg_split('/[^a-z0-9]/', 
      strtolower($title), 
      PREG_SPLIT_NO_EMPTY)); 
0

使用trim

trim(preg_replace('/[^a-z0-9]+/i', "-", strtolower($title)), '-')