我正在写一个小型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
但这个表达看起来像屁股。必须有更好的编码方式,或者那里的东西,我只是不知道。任何帮助将不胜感激
答案 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)), '-')