0

データベース サイト用のクリーンな URL を作成したいのですが、それぞれのエントリの URL を格納するフィールドを作成するのが最善の方法であると判断しました。

GenerateUrl 関数 (ここにあります) を使用して、ソース名からクリーンな URL を作成しています:-

function GenerateUrl ($s) {

    // Convert accented characters, and remove parentheses and apostrophes
    $from = explode (',', "ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u,(,),[,],'");
    $to   = explode (',', 'c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u,,,,,,');

    // Do the replacements, and convert all other non-alphanumeric characters to spaces
    $s = preg_replace ('~[^\w\d]+~', '-', str_replace ($from, $to, trim ($s)));

    // Remove a - at the beginning or end and make lowercase
    return strtolower (preg_replace ('/^-/', '', preg_replace ('/-$/', '', $s)));
}

アポストロフィに問題がありますが、ほとんどの場合うまく機能します。

引用符として使用すると (つまり、片側で別の文字に触れるだけ)、正常に機能します:-「エッフェル塔 (パリ)」が URL になります:eiffel-tower-paris

しかし、実際のアポストロフィとして使用されている (つまり、2 つの文字に挟まれている) ため、あまり適切ではありません:- St Paul's Cathedral (London) は URL になります:st-paul-s-cathedral-london

PHP 5.4.3 を使用しており、マジック クォートの変更を元に戻すコードがあります (これが問題の原因である必要があります)。

これを解決するためのアドバイスは大歓迎です。

ありがとう、

アンディ


はい、希望する URL は次のとおりです。st-pauls-cathedral-london

DOES が機能する元の関数コードを見つけたところです ($from 行と $to 行の末尾のアポストロフィは、それぞれ何も置き換えられません)。

ただし、ページ上でライブの名前に関数を適用した場合にのみ機能するようです。

<?php echo generateurl($attraction['attraction_name']); ?>

しかし、私が現在行っているのは、データが Web サイトに入力されたときに index.php ファイル内の関数を適用することです。問題は、(魔法の引用符を処理するために) 以下の関数が既に適用されている値に関数を適用しているという事実から来ていると思われます:-

$attraction_name = mysqli_real_escape_string($link, $_POST['attraction_name']);
$attraction_url = generateurl($attraction_name);

mysqli_real_escape_string の影響を受ける前に、attraction_name から URL を生成するために、いくつかのコーディングを変更する必要があると思います。乗り方を教えてくれる...

4

3 に答える 3

3

そうst-paul-s-cathedral-londonでない場合は、あなたが望んでいたと思いますst-pauls-cathedral-londonか?その場合、文字列からすべてのアポストロフィを完全に削除するのが最善だと思います。文字の間にある場合は完全に削除されるため、 にpaul'sなりますpaulsが、別の文字がある場合、その文字はとにかくダッシュになるので、アポストロフィはまだ必要ありません.

以下に示すように、最後の行を変更します。を何も置き換え'ず、より単純な を使用しtrimて先頭と末尾のダッシュを削除します。正規表現は不要で、コードはより短く、より明確になります。

return trim(str_replace("'", '', strtolower($s)), '-');
于 2012-11-21T19:15:00.267 に答える
2

別の正規表現を追加して、アポストロフィを削除します。

$s = str_replace ($from, $to, trim ($s));
$s = preg_replace("~'~", '', $s);
$s = preg_replace ('~[^\w\d]+~', '-', $s);
于 2012-11-21T19:16:40.617 に答える
0

はい、「mysqli_real_escape_string」が問題の原因であることが判明しました。コードを少し並べ替えると、コードが並べ替えられたようです:-

$attraction_url = generateurl($_POST['attraction_name']);
$attraction_name = mysqli_real_escape_string($link, $_POST['attraction_name']);

ありがとう!

アンディ


URLの先頭から「the」、「a」、および「an」を削除する方法:-

上記のGenerateUrl関数コードの一番下の行を次のように置き換えます。-

return strtolower (preg_replace ('/^-/', '', preg_replace ('/-$/', '', preg_replace ('/\b(^the|^a|^an)\b/i', '', $s))));

StackOverflowからのこのテーマに関する役立つアドバイス。

また、 Regexチュートリアルの正規表現の単語境界に\bを使用することに関する優れた記事です。

于 2012-11-22T11:14:07.180 に答える