4

我目前正在使用此正则表达式替换字符串中的所有非字母数字字符并用破折号替换它们

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

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

4

5 回答 5

6

由于您使用的是 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";

打印:

我怎样才能解决这个问题

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

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

echo preg_replace('/[^0-9a-z.]+/', '-', preg_replace('/[^0-9a-z.]+$/', '', $string)) . "\n";
于 2013-01-21T21:28:42.880 回答
2

我认为您必须分两步执行此操作,因为您有两种不同的情况:在字符串的开头和中间,您想用“-”替换非字母数字。最后,您想用空字符串替换它们。

于 2013-01-21T21:25:29.297 回答
2

你总是可以trim("-how-can-i-fix-this-", "-");的。

于 2013-01-21T21:33:26.457 回答
1

实际上,它可以在一个正则表达式中完成:

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

笔记:

  • 为了将来参考,'-\1''-\\1'"-\\1""-$1"都是替换字符串的有效替代项。
  • 在这种情况下,所有格量词并不是真正必要的。但是,即使速度提高微乎其微,我也总是使用它们。

编辑:

第三种情况(第一个字符不是字母数字)也可以用一个正则表达式完成:

$newString = preg_replace('/(?:^[^a-z0-9.]++([a-z0-9.]++))?[^a-z0-9.]++([a-z0-9.]++)(?:[^a-z0-9.]++$)?/i', '$1-$2', $string);

于 2013-01-21T22:02:22.730 回答
0
$string = 'How can I fix this?';
$string = trim(preg_replace('/[^A-Za-z0-9]/', '-', $string), '-'); 

用 替换所有非字母数字'-',然后从末端修剪。

于 2013-01-21T23:06:13.217 回答