Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式将特殊字符替换为连字符,第一个和最后一个字符除外_Php_Regex - Fatal编程技术网

Php 正则表达式将特殊字符替换为连字符,第一个和最后一个字符除外

Php 正则表达式将特殊字符替换为连字符,第一个和最后一个字符除外,php,regex,Php,Regex,我使用这个正则表达式将歌曲名格式化为url友好的别名。它用连字符替换一个或多个特殊字符和空格的连续实例 $alias = preg_replace("/([^a-zA-Z0-9]+)/", "-", trim(strtolower($name))); 这很好,因此如果歌曲名是This*is*a(歌曲)名,它将创建别名This-is-a-song-name。但是,如果名称的开头或结尾有特殊字符*这是一首歌曲(名称),它将创建-This-is-a-song-name-在每一端创建连字符 如何修改正

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

$alias = preg_replace("/([^a-zA-Z0-9]+)/", "-", trim(strtolower($name)));
这很好,因此如果歌曲名是
This*is*a(歌曲)名
,它将创建别名
This-is-a-song-name
。但是,如果名称的开头或结尾有特殊字符
*这是一首歌曲(名称)
,它将创建
-This-is-a-song-name-
在每一端创建连字符


如何修改正则表达式以替换如上所述,但将第一个和最后一个特殊字符替换为空字符。

您需要进行双重替换

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

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

  • 在第一步中,删除字符串开头和结尾的特殊字符
  • 在第二步中,您可以像现在一样重用正则表达式
代码可能如下所示:

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

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

你有没有考虑过使用第二个过滤器,如果字符串的头和尾有连字符,它会修剪它们?是的,我确实考虑过,但我想尝试一下,看看是否有可能在一个正则表达式语句中完成它