【问题标题】:Convert function from Javascript to PHP [closed]将函数从 Javascript 转换为 PHP [关闭]
【发布时间】: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


【解决方案1】:

strtrstr_split 都不适合您,因为您的代码包含 unicode 字符。如果您喜欢使用,这里有一些有用的东西。

str_split_unicode:https://github.com/qeremy/unicode-tools.php/blob/master/unicode-tools.php#L145
strtr_unicode:https://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;

出局;

嘿嘿-你好吗! 嘿嘿-_how_are_you-

【讨论】:

  • 谢谢你,strtr_unicode 工作。
【解决方案2】:

这段代码应该可以工作:

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

    • 我收到此错误:PHP Parse error: syntax error, unexpected T_VARIABLE in /var/www/slug.php on line 15 现在我将添加根据您的建议编辑的代码。
    • strtrstr_replace 更推荐,这样你就不会被链式替换。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多