除了first和last之外,正则表达式用连字符替换特殊字符

时间:2015-03-04 16:12:45

标签: php regex

我正在使用此正则表达式将歌曲名称格式化为url友好别名。它用连字符替换1个或多个连续的特殊字符和空格实例。

$alias = preg_replace("/([^a-zA-Z0-9]+)/", "-", trim(strtolower($name)));

这样可以正常使用,如果歌曲名称为This is *is* a (song) NAME,则会创建别名this-is-a-song-name。但如果名称在开头或结尾*This is a song (name)有特殊字符,则会在每一端创建-this-is-a-song-name-创建连字符。

如何修改要替换的正则表达式,但要用空格替换第一个和最后一个特殊字符。

2 个答案:

答案 0 :(得分:4)

您需要进行双重替换。

$str = '*This is a song (name)';
$s   = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $str);
echo preg_replace('~[^a-zA-Z0-9]+~', '-', $s);

答案 1 :(得分:1)

您可以分两步执行:

  • 在第一步中,删除字符串开头和结尾的特殊字符
  • 在第二步中,您可以像现在一样重复使用正则表达式。

代码可能如下所示:

$alias = preg_replace("/(^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$)/", "", trim(strtolower($name));
$alias = preg_replace("/([^a-zA-Z0-9]+)/", "-", $alias);

(我没有测试过,但你可能会得到这个想法)