【发布时间】:2013-02-01 12:46:34
【问题描述】:
我有这个 javascript 函数,可以将任何字符串转换为 完美的 slug(在我看来)。
function slugGenerator(str) {
str = str.replace(/^\s+|\s+$/g, '');
str = str.toLowerCase();
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
var to = "aaaaeeeeiiiioooouuuunc------";
for (var i=0, l=from.length ; i<l ; i++) {
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
str = str.replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '_').replace(/-+/g, '-');
return str;
}
我需要转成PHP,我试过了,结果是:
function slugGenerator($str) {
$str = preg_replace('/^\s+|\s+$/g', '', $str);
$str = strtolower($str);
$from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
$to = "aaaaeeeeiiiioooouuuunc------";
for ($i = 0, $l = strlen($from); $i<$l ; $i++) {
$str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
$str = preg_replace('/[^a-z0-9 -]/g', '', $str)
$str = preg_replace('/\s+/g', '_', $str)
$str = preg_replace('/-+/g', '-', $str);
return $str;
}
我对这个 for 循环有疑问:
for ($i = 0, $l = strlen($from); $i<$l ; $i++) {
// This string
$str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
我不知道如何将其转换为 PHP,有人可以尝试转换它吗?
解决方案: 添加strtr_unicode 函数并使用此脚本:
function slugGenerator($str) {
$str = preg_replace('/^\s+|\s+$/', '', $str);
$str = strtolower($str);
$from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
$to = "aaaaeeeeiiiioooouuuunc------";
$str = strtr_unicode($str, $from, $to);
$str = preg_replace(
array("~[^a-z0-9 -]~i", "~\s+~", "~-+~"),
array("", "_", "-"),
$str
);
return $str;
}
【问题讨论】:
-
我在这里遗漏了什么吗?当你所做的只是替换一个确切的字符时,你为什么要创建一个正则表达式?
str.replace( from[i], to[i] )应该够了吧? -
只需使用 PHP 的
str_replace(),这里不需要正则表达式。它将接受数组作为输入,explode()你的$from并将其传递给str_replace()。 -
@kjetilh 不,因为没有正则表达式和全局标志,它只会替换第一次出现的字符。并且使用 [] 从字符串中获取字符在旧浏览器中不起作用,因为这在 Javascript 中不是标准的。
标签: php javascript regex preg-replace slug