3

コンテンツの多言語化を可能にする php で構築しているサイトがあります。サイトの一部にはビジネス リスティングがあります。これらのリスティングを表示するために SEO フレンドリーな URL を設定しているので、たとえば、「A bar down the street」というビジネス リスティングを作成します。URL は次のようになります。

/listing/a-bar-down-the-street

ただし、このリストのアラビア語版があるとしましょう。名前は次のようになります。

شريط الشارع

それを英語版と同じ URL 形式にする方法を教えてください。文字列を seo に適した URL に変換するアラビア語版の関数を試してみると、空に戻ってきました。

編集: さらに明確にするために、私が探しているのは、サイトの言語に関係なく、任意の文字列を SEO フレンドリーな URL に変換できる php 関数だけです。

編集パート 2 以下は、文字列を SEO フレンドリーな URL に書き換えるために使用する関数です。おそらく、言語にやさしいものにするために何を追加する必要があるか教えていただけますか?

    public function urlTitle($str,$separator = 'dash',$lowercase = TRUE)
    {

        if ($separator == 'dash')
        {

            $search     = '_';
            $replace    = '-';

        }else
        {

            $search     = '-';
            $replace    = '_';

        }

        $trans = array(
                        '&\#\d+?;'              => '',
                        '&\S+?;'                => '',
                        '\s+'                   => $replace,
                        '[^a-z0-9\-_]'          => '',
                        $replace.'+'            => $replace,
                        $replace.'$'            => $replace,
                        '^'.$replace            => $replace,
                        '\.+$'                  => ''
                        );

        $str = strip_tags($str);
        $str = preg_replace("#\/#ui",'-',$str);

        foreach ($trans AS $key => $val)
        {

            $str = preg_replace("#".$key."#ui", $val, $str);

        }

        if($lowercase === TRUE)
        {

            $str = mb_strtolower($str);

        }

        return trim(stripslashes($str));

    }
4

4 に答える 4

1

既存の SOディスカッションで同様のディスカッションを見つけました。あなたが要求していることは、「すぐに使える」可能性があるようです。

Web サーバーの構成を調べて、何が問題なのかを確認することをお勧めします。seo に適した英語の URL と、他の URL エンコード可能な文字列との間に違いはないはずです。

どのWebサーバーを実行していますか?

更新 あなたは英数字のみを受け入れているようです:

'[^a-z0-9\-_]'          => '',

az 以外の文字が除外され、空のリターンが発生する可能性があると思われます。または、代わりに、関数をデバッグして、置換条件のどれがコンテンツを消去するかを確認することもできます。

ここで遭遇するのは、デフォルトでは URL に文字を含めることができないということです。ブラウザは一般にエンコーディングを使用して見栄えの良い多言語 URL を実現します。

リンクの例を参照してください:

URL には、数字、ダッシュ、スラッシュ、および疑問符を含む特定の英字セットのみを使用できます。他のすべての文字はエンコードする必要があり、これはラテン語以外のドメイン名に適用されます。fronedق.com にアクセスすると、ブラウザによってはそれをデコードして fronedق.com が表示されることに気付くでしょうが、Chrome などのブラウザではhttp://www.xn--mgbq6cgr.com/のようなものが表示されます。

つまり、投稿のタイトルをフィルター処理して、URL で有効な文字のみを許可することはできなくなりました。タイトルをエンコードして、ブラウザーが希望どおりにレンダリングすることを期待する必要があります。

別のオプションは、文字変換を使用することです。おそらく、URL でエンコードされた特殊文字をレンダリングしないことが知られているブラウザーを検出した後です。

于 2012-05-14T16:04:47.427 に答える
0

だから、私にとってうまくいくように見えるのは、私のphp関数のこの部分を取り出したものです:

'[^a-z0-9\-_]'          => '',

そして strtolower 行を次のように更新します。

$str = mb_strtolower($str,'UTF-8');

そして、それは通常どおりに機能するようです。ただし、これが今後機能することを誰でも確認できますか? ブラウザはすべての言語でこれを理解できますか? または、すべてのブラウザーが URL を理解できるように文字列を正規化する必要がありますか? 問題は、php 5.3 を使用していないことです。これは、php の正規化拡張機能をインストールするために必要です。アップグレードすると問題が発生するのではないかと心配しています。現在 5.2x を使用しています。

于 2012-05-14T18:35:19.877 に答える
0

ジョン、その通りです。主な問題は、正規表現文字クラス ( [^a-z0-9\-_]) が UTF-8 文字を許可していないことです。これはうまくいくはずです:[^\p{L}0-9\-_]

私は最近、このような関数に取り組んでおり、思いついた関数を含むブログ投稿を公開しました: Creating SEO Friendly URLs in PHP with url_slug()

于 2012-07-13T20:04:49.553 に答える