如何使用 preg_replace 在输出字符串中保留连字符

How to keep hyphen in output string with preg_replace

我有以下要求。

输入 ----------: z-edu-l1-^threat -emergency mk pl.jpg

必需 ----: z-edu-l1-_threat_-emergency_mk_pl.jpg

我使用以下

$input = 'z-edu-l1-^threat -emergency mk pl.jpg';

echo strtolower(preg_replace('/\W(?![^.-]*$)/', '_', trim($input)));

我得到以下输出

z_edu_l1__threat__emergency_mk_pl.jpg

我不想用下划线替换 - 符号。如何使用 preg_replace 在输出字符串中保留连字符?

您可以将 \W 替换为其取反字符 class 等效 [^\w] 并取反您需要保留的符号:

[^\w.-]

regex demo

[^\w.-] 匹配任何非 letter/digit、_.-.

的字符

参见 PHP demo:

$input = 'z-edu-l1-^threat -emergency mk pl.jpg';
echo strtolower(preg_replace('/[^\w.-]/', '_', trim($input)));
// => z-edu-l1-_threat_-emergency_mk_pl.jpg
$input = "z-edu-l1-^threat -emergency mk pl.jpg";
$output = str_replace(["^", " "], "_", $input);
echo $output;
//output
//z-edu-l1-_threat_-emergency_mk_pl.jpg

[^something] 将找到除 {something} 之外的匹配项 \w -> 字母表 [^\w.-] 将找到除字母、句点和连字符以外的任何内容,并将其替换为下划线。

$input = 'z-edu-l1-^threat -emergency mk pl.jpg';

echo strtolower(preg_replace('([^\w.-])', '_', trim($input)));

看直播demo here