記事を掲載するウェブサイトを作成する必要があります。たとえば、ページのURLなど、わかりやすいURLを作成したいと思います。
タイトル:記事のテスト
http://www.example.com/articles/article_test
になります。
もちろん、?
や#
などのタイトルからいくつかの文字を削除する必要がありますが、どの文字を削除するのかわかりません。
誰かが安全に保持できるキャラクターを教えてもらえますか?
注意する必要がある2つの文字セットがあります:予約済みおよび安全でない。
予約済み文字は次のとおりです。
一般的にnsafeと見なされる文字は次のとおりです。
私は1つ以上を忘れているかもしれません、それは私にカールVの答えをエコーすることにつながります。長い目で見れば、許可された文字の「ホワイトリスト」を使用し、サーバーやシステムで許可されていない文字に遅れを取らないようにするよりも、文字列をエンコードする方がよいでしょう。
特定の文字(ブラックリスト)を削除するのではなく、一部の文字(ホワイトリスト)のみを保持するのが最適です。
適切にエンコードすれば、技術的に任意のキャラクターを許可できます。しかし、質問の精神で答えるには、次の文字のみを許可する必要があります。
他のすべては潜在的に特別な意味を持っています。たとえば、+を使用できると思うかもしれませんが、スペースに置き換えることができます。 &も、特に書き換えルールを使用する場合は危険です。
他のコメントと同様に、詳細については標準と仕様を確認してください。
これらは(理論上/仕様上)安全であり、基本的にはドメイン名を除くすべての場所です。
リストされていないものはすべてパーセントエンコードしてください。
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
特定のURLコンポーネント内で使用される場合のみ安全です。注意して使用してください。
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
URI仕様(RFC 3986)によると、他のすべての文字はパーセントエンコードする必要があります。これも:
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
最大の互換性が懸念される場合は、文字セットをA-Z a-z 0-9-_に制限してください。
(ファイル名拡張子のピリオドのみ)。
RFC3986-Uniform Resource Identifier(URI):Generic Syntax を見ると、質問はURIのpathコンポーネントを中心に展開しています。
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
セクション3.3を引用すると、URI segment
の有効な文字はpchar
タイプです。
pchar =未予約/ pctエンコード/サブデリム/ ":"/"@"
内訳は次のとおりです。
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
または、言い換えれば、 ASCIIテーブル 、except/
、?
、#
、[
および]
の任意の(非制御)文字を使用できます。 。
この理解は RFC1738-Uniform Resource Locators(URL) によって裏付けられています。
未予約= ALPHA/DIGIT/"-"/"。"/"_"/"〜"
あなたが説明する文脈から、あなたが実際に作ろうとしているのは「SEOナメクジ」と呼ばれるものだと思います。これらの一般的なベストプラクティスは次のとおりです。
そのため、例として、「コミックでのSりを表すための!@%$ *の使用」というタイトルの記事は、「usage-represent-swearing-comics」のスラッグを取得します。
URIの形式は RFC 3986 で定義されています。詳細については、セクション3.3を参照してください。
SEOの観点からは、ハイフンはアンダースコアよりも優先されます。小文字に変換し、すべてのアポストロフィを削除してから、英数字以外の文字列をすべて単一のハイフンに置き換えます。開始点と終了点で余分なハイフンを削除します。
私は同様の問題を抱えていたので、きれいなURLを持ちたいと思っていましたが、URLには文字、数字、および_のみを許可する必要があるという結論に達しました。それで問題ありません。ニースの正規表現をいくつか書いたところ、すべてのUTF8文字が.NETの文字ではなく、ねじ込まれていることを認識しました。これは、.NET正規表現エンジンの既知の問題のようです。 SOこのソリューションに到達しました:
private static string GetTitleForUrlDisplay(string title)
{
if (!string.IsNullOrEmpty(title))
{
return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
}
return string.Empty;
}
/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
string x = m.ToString();
if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
{
return x.ToLower();
}
else
{
return "-";
}
}
Ajax/phpを介して値をURLに返していたときに、URLを安全なURLにエンコードすると、ページによって再度読み取られるので非常に便利です。
特殊文字&のURLエンコーダーを使用したPHP出力
//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";
//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;
//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.
setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);
誰もが私の小さなコードの抜粋が役立つことを願っています! :)
「URLエンコード」のようなものを探していると思います-Webで使用するのに「安全」であるようにURLをエンコードします:
以下がそのためのリファレンスです。特殊文字が必要ない場合は、URLエンコードを必要とするものをすべて削除します。