必须有一个更好的正则表达式

时间:2011-03-10 04:24:41

标签: php regex

我正在写一个小型CMS,我正在尝试将标题变成带有破折号的URL slug。我知道我需要做几件事我已经完成了所有工作,但我只是不喜欢它。问题似乎是如果最后有任何特殊字符,我需要在它进入数据库之前删除它们。我能想出这样做的唯一方法是在一个语句中做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

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

3 个答案:

答案 0 :(得分:4)

您可以使用数组输入只调用一次preg-replace

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

请注意,现有代码会保留前导-(如果有)。上面的代码摆脱了这一点。

答案 1 :(得分: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));

答案 2 :(得分:0)

使用trim

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