如何在一个preg_replace()函数中将所有非单词字符和多个空格替换为' ',然后将所有空格替换为'-'?

4
我希望根据以下条件更改图像名称:
  • 所有非单词字符都变成空格,然后
  • 所有空格都变成-
这意味着,如果我的图像名称为:Hello My name is'Kh@n "Mr. .Khan ",则应更改为Hello-My-name-is-kh-n-mr-Khan
我需要分两步完成:
$old_name ='       Hello       My name is\'Kh@n "Mr. Khan        ';
$space_name = preg_replace('/\W/',' ', $old_name);
$new_name= preg_replace('/\s+/','-', $space_name);

echo $new_name // returns Hello-My-name-is-kh-n-mr-Khan

有没有一种方法可以在一步中同时应用这两个条件?

3
为什么要一步完成呢?将其分为两个步骤要简单得多,而且将其合并也不会带来任何好处。 - Amber
所以分两步来做也没关系...谢谢你,Amber。 - JustLearn
4个回答

6

preg_replace函数可以接受数组参数:

$new_name = preg_replace(array('/\s+/', '/\W/'), array('_', '-'), $old_name);

这种写法更加简明,但我认为并不一定更高效。文档没有明确规定正则表达式的应用顺序。因为空格字符不属于单词字元,所以更安全的写法是:

$new_name = preg_replace(array('/\s+/', '/[^\s\w]/'), array('_', '-'), $old_name);

2

我发现这个函数的输出(Hello_My_name_is-Kh-n_-Mr-_Khan_)有点丑陋。
这是我的方法:

$name ='Hello       My name is\'Kh@n "Mr. Khan" ';
$name = preg_replace('/\W/',' ', $name);
$name = trim($name);
$name = strtolower($name);
$name = preg_replace('/\s+/','-', $name);

输出 你好-我的名字是-kh-n-mr-khan


Sharpnel...感谢您的好主意,我们如何限制名称的长度(仅200个字符)? - JustLearn
@JustLearn 你也可以添加 substr() 函数调用。 - Your Common Sense
开始用破折号替换\W+并修剪破折号。这样您就不需要进行第二次替换。最终将\W更改为[\W_] - Casimir et Hippolyte

0

你可以在 preg_replace 中使用数组:

$old_name ='Hello       My name is\'Kh@n "Mr. Khan ';
$new_name = preg_replace(array('/\s+/','/\W/'),array('_','-'),$old_name);

另外,

您的代码片段存在语法错误,需要在K之前转义单引号。


0

这是用来重命名上传的图片吗?如果是,请记住...

  • 最大字符数(应该在适当位置剪切)
  • 非 ASCII 字符?(最好进行音译)

我需要更注意什么? - JustLearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接