Regex将除第一个和最后一个字符外的特殊字符替换为连字符


Regex replace special characters with hyphen except first and last

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

$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-,在每个结尾创建连字符。

我如何修改regex以如上所述进行替换,但用空格替换第一个和最后一个特殊字符。

您需要进行双重替换。

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

您可以通过两个步骤执行:

  • 在第一步中,删除字符串开头和结尾的特殊字符
  • 在第二步中,您可以像现在一样重用regex

代码可能看起来像这样:

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

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