【问题标题】:Regex replace special characters with hyphen except first and last正则表达式用连字符替换特殊字符,除了第一个和最后一个
【发布时间】:2015-05-05 17:28:45
【问题描述】:

我正在使用这个正则表达式将歌曲名称格式化为 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-,并在每一端创建连字符。

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

【问题讨论】:

  • 您是否考虑过使用第二个过滤器来修剪字符串头部和尾部的连字符(如果它们存在)?
  • 是的,确实考虑过,但我想试试看是否可以在一个正则表达式语句中做到这一点

标签: php regex


【解决方案1】:

您可以分两步完成:

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

代码可能如下所示:

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

(我没有测试过,但你可能明白)

【讨论】:

    【解决方案2】:

    你需要做一个双重替换。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多