回答:
RFC 3986のセクション2.3を引用するには:
「URIで許可されているが予約された目的がない文字は、予約されていません。大文字と小文字、10進数、ハイフン、ピリオド、アンダースコア、およびチルダが含まれます。」
ALPHA DIGIT "-" / "." / "_" / "~"
RFC 3986に記載されている句読点は、以前のRFC 2396よりも少ないことに注意してください。
ç
やなどのラテン語でエンコードされた文字が含まれõ
ますか?
post-title-with-%C3%A7-and-%C3%B5
ますが、ユーザーのロケーションバーにはとして表示されpost-title-with-ç-and-õ
ます。
注意が必要な文字セットは2つあります:reservedとunsafeです。
予約文字は次のとおりです。
安全でないと一般的に見なされている文字は次のとおりです。
私は1つ以上を忘れた可能性があります。長い目で見れば、サーバーとシステムで許可されていない文字に遅れを取らないようにするよりも、許可された文字の「ホワイトリスト」を使用して文字列をエンコードする方が良いでしょう。
#
特定のページのブックマークに使用される予約文字であり、一致する名前属性またはID属性(sans #
-symbol)を持つ1つのHTML要素を持つことによって作成されます。
~
が安全でないことに異議を唱えているようです。よろしいですか?
特定の文字(ブラックリスト)を削除するのではなく、一部の文字(ホワイトリスト)のみを保持するのが最善です。
技術的には、適切にエンコードする限り、任意の文字を許可できます。ただし、質問の精神で答えるには、次の文字のみを許可する必要があります。
他のすべてのものは潜在的に特別な意味を持っています。たとえば、+を使用できると思うかもしれませんが、スペースで置き換えることができます。&も、特にいくつかの書き換えルールを使用している場合は危険です。
他のコメントと同様に、詳細については規格と仕様を確認してください。
これらは安全であり(理論上/仕様上)、基本的にドメイン名を除いてどこでもです。
リストされていないものをパーセントエンコードすれば、準備は完了です。
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
特定のURLコンポーネント内で使用する場合にのみ安全です。注意して使用してください。
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
URI仕様(RFC 3986)によると、他のすべての文字はパーセントエンコードする必要があります。これも:
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
最大の互換性が問題になる場合は、文字セットをAZ az 0-9-_に制限してください。
(ファイル名拡張子のピリオドのみ)。
仕様ごとに有効であっても、URLはコンテキストによっては「安全でない」場合があります。無効なファイル名文字を含むfile:/// URL、または区切り文字として使用されていない場合の「?」、「=」、および「&」を含むクエリコンポーネントなど。これらのケースの正しい処理は、通常はスクリプト次第であり、回避できますが、これは覚えておくべきことです。
params.toString() // "key=730d67"
"(3)PHP Manual、http-build-query: "Generate URL-encoded query string。[...]上記の例は出力します:0=foo&1=bar[...]
"(4)J.スター、生鮮プレス:" Webページを作成するとき、パラメーター化されたクエリ文字列を必要とするリンクを追加する必要があることがよくあります。 "
見てみるとRFC3986 -統一資源識別子(URI):一般的な構文、周りのあなたの質問の公転パス URIのコンポーネント。
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 = unreserved / pct-encoded / sub-delims / ":" / "@"
内訳は次のとおりです。
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
言い換えれば:あなたはから任意の(非制御- )文字を使用することができASCIIテーブル、除く外 /
、?
、#
、[
と]
。
この理解は、RFC1738-Uniform Resource Locators(URL)によって裏付けられています。
-
と;
安全である、それは私の答えとRFCが明記ものです。
予約なし= ALPHA / DIGIT / "-" / "。" / "_" / "〜"
あなたが説明する文脈から、あなたが実際に作ろうとしているのは「SEOスラッグ」と呼ばれるものだと思います。それらのための最も一般的な既知の慣行は:
したがって、例として、「!@%$ *を使用してコミックスの誓いを表現する」というタイトルの記事は、「usage-represent-swearing-comics」のスラッグになります。
同様の問題がありました。かなりのURLが必要で、URLには文字、数字、および_のみを許可する必要があるという結論に達しました。それで結構です、それから私はいくつかの素晴らしい正規表現を書いて、それがすべてのUTF8文字が.NETの文字ではなく、ねじ込まれていることを認識していることに気付きました。これは、.NET正規表現エンジンの既知の問題のようです。だから私はこの解決策を得ました:
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にエンコードすると非常に便利です。
特殊文字&の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エンコードが必要な文字を削除してください。