将函数从Javascript转换为PHP

时间:2013-02-16 18:03:51

标签: php javascript regex preg-replace slug

我有这个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;
}

4 个答案:

答案 0 :(得分:2)

strtrstr_split都不适合您,因为您的代码包含unicode字符。如果您愿意,可以使用一些有用的东西。

str_split_unicodehttps://github.com/qeremy/unicode-tools.php/blob/master/unicode-tools.php#L145
strtr_unicodehttps://github.com/qeremy/unicode-tools.php/blob/master/unicode-tools.php#L223

测试:

echo strtr_unicode("Hëëëy, hôw ärê yôü!", $from, $to);
// outs: Heeey- how are you!

之后,您可以将数组用作preg_replace;

的参数
$from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
$to   = "aaaaeeeeiiiioooouuuunc------";
$str = strtr_unicode("Hëëëy, hôw ärê yôü!", $from, $to);
echo $str ."\n";
// according to this line: 
// str = str.replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '_').replace(/-+/g, '-');
$str = preg_replace(
    array("~[^a-z0-9 -]~i", "~\s+~", "~-+~"),
    array("-", "_", "-"),
    $str
);
echo $str;

前前后后;

Heeey- how are you!
Heeey-_how_are_you-

答案 1 :(得分:0)

此代码应该有效:

$str = preg_replace('/'.$from[$i].'/', $to[$i], $str);

答案 2 :(得分:0)

PHP函数str_replace可以接受数组参数。因此,如果您将$from$to转换为数组,则可以使用:

$str = str_replace($from, $to, $str);

$from的所有出现替换为$to$str内的相应项,而不是for循环。

要快速将$from$to转换为数组,您可以使用str_split

$from = str_split($from); // meaning your original string from the question
// same for $to

答案 3 :(得分:0)

删除for循环。 strtr基本上是为了你想要做的事情而做的:

$str = strtr($str, $from, $to);