0

私は、任意の文字列を完全なスラッグに変換するこの JavaScript 関数を使用しました(私の意見では)。

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

4 に答える 4

2

コードにユニコード文字が含まれているため、両方とも機能strtrしません。str_split使いたいと思えば便利なものもあります。

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;

アウト;

お元気ですか!
Heeey-_how_are_you-
于 2013-02-16T18:25:00.303 に答える
0

このコードは動作するはずです:

$str = preg_replace('/'.$from[$i].'/', $to[$i], $str);
于 2013-02-16T18:06:09.593 に答える
0

PHP 関数 str_replace は、配列引数を取ることができます。したがって、$fromand$toを配列に変換すると、次を使用できるようになります。

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

for ループの代わりに、 のすべての出現箇所を の内部の$fromそれぞれの項目に置き換えます。$to$str

変換$from$toて配列にすばやく変換するには、次を使用できますstr_split

$from = str_split($from); // meaning your original string from the question
// same for $to
于 2013-02-16T18:11:52.793 に答える
0

forループを 取り外します。strtr基本的にあなたがやろうとしていることのために作られました:

$str = strtr($str, $from, $to);
于 2013-02-16T18:28:43.153 に答える