除非匹配位于字符串的末尾,否则正则表达式将替换所有匹配项

时间:2013-01-21 21:19:17

标签: php regex string preg-replace

我目前正在使用此正则表达式替换字符串中的所有非字母数字字符并将其替换为短划线

$newString = preg_replace("/[^a-z0-9.]+/i", "-", $string);

以下字符串正常

$string = "this will work fine";
$newString = "this-will-work-fine";

但是如果字符串有一个非字母数字作为最终字符,它将匹配并替换它,正如人们所怀疑的那样。

$string = "How can I fix this?";
$newString = "How-can-I-fix-this-";

如何改进此正则表达式以获得以下输出?

$newString = "How-can-I-fix-this";

正则表达式应该在两个情况下都有效。我知道我可以用一个单独的函数来修剪字符串,但理想情况下我想使用一个正则表达式。这可能吗?

3 个答案:

答案 0 :(得分:5)

由于您使用的是PHP,因此您可以定义多种模式&一次性替换。这是一个快速演示:

$string = "How can I fix this?";
$patterns = array('/[^0-9a-z.]+/i', '/[^0-9a-z.]+(?=$)/i');
$replacements = array('-', '');

echo preg_replace($patterns, $replacements, $string) . "\n";

打印:

How-can-I-fix-this

这实际上只不过是两次连续替换:

$string = "How can I fix this?";

echo preg_replace('/[^0-9a-z.]+/', '-', preg_replace('/[^0-9a-z.]+$/', '', $string)) . "\n";

答案 1 :(得分:2)

我认为你必须分两步完成这项工作,因为你有两种不同的情况:在字符串的开头和中间,你想要用' - '替换非字母数字。最后,您想要用空字符串替换它们。

答案 2 :(得分:1)

您可以随时trim("-how-can-i-fix-this-", "-");