HTMLで単一引用符を使用できますか?


146

私は、PHPで二重引用符を使用して文字列を連結するのではなく変数を補間できるようにすることに大いに時間を費やしています。その結果、HTMLを生成するときは、タグフィールドの設定に一重引用符を使用することがよくあります。例えば:

$html = "<input type='text' name='address' value='$address'>";

これはどちらかよりもはるかに読みやすくなっています

$html = "<input type=\"text\" name=\"address\" value=\"$address\">";

または

$html = '<input type="text" name="address" values="' . $address . '">' ;

簡単な検索から、HTMLフィールドの単一引用符はすべてのブラウザで認識されないという人の話を聞いたことがあります。したがって、どのブラウザで単一引用符のHTMLを認識できないのでしょうか。


2
の重複の可能性がありますか?
Brad Werth 2014

回答:


149

これは、HTMLの単一引用符が人気になったのはいつですか?。HTMLの属性を囲む単一引用符は、仕様により常に許可されています。どのブラウザもそれらを理解しないと思います。


13
ここで言及しなければならないことの1つは、一部のHTMLクライアント(ブラウザではない)が単一引用符で互換性のある問題を抱えていることです。奇妙な例の1つは、Hotmailで<img src='cid:xxx' ... />インライン画像の表示に使用した場合、コンテンツIDが無視されたためにまったく表示されないことです。代わりに `<img src =" cid:xxx "... />を使用する必要があります。
Earth Engine

52

PhiLhoが述べたように、属性値には単一引用符を使用できないと広く信じられていますが、その考えは間違っています。

XML標準は、属性値の周りの単一引用符と二重引用符の両方が可能になります。

XHTML標準はこれを変更するために何も述べていませんが、属性値を引用符で囲む必要があることを示す関連セクションでは、例では二重引用符を使用しているため、おそらくこの混乱を招いています。この例は、XHTMLの属性値がXMLの属性値の最低基準を満たす必要があることを単に指摘しています。つまり、(気にしないプレーンHTMLとは対照的に)引用符で囲む必要がありますが、単一または二重引用符。

もちろん、標準に準拠していないパーサーに遭遇する可能性は常にありますが、その場合、すべての賭けがとにかくオフになります。そのため、仕様の内容を守ることをお勧めします。だからこそ、私たちには仕様があります。


2
+1は、XML標準へのリンクです。私はこれが古いスレッドであることを知っていますが、完全を期すために、標準内のAttValue文法仕様に特に注意を払う必要があります。EBNF(正規表現と非常によく似ています)を読むことができる場合は、一重引用符と二重引用符の両方を使用して属性を区切ることができます。
daiscog

7
ただし、HTMLはSGML(XMLに基づくXHTML)に基づいているため、XML仕様を引用してもあまり役に立ちません…
Donal Fellows

実際の混乱は、属性値の単一引用符または二重引用符を常にエスケープする必要があるかどうかです。属性値を二重引用符で囲む場合、二重引用符はエスケープする必要がありますが、単一引用符はエスケープする必要があります。代わりに属性値の前後に一重引用符を使用する場合、二重引用符ではなく一重引用符をエスケープする必要があります。そして、それがどちらかを許可することの要点だと思います。値に二重引用符がたくさんある場合は、値全体を一重引用符で囲むことでエスケープを回避できます。逆も同様です。
Triynko 14

問題は、XHTMLドキュメントモードを使用している場合、JavaScriptインタープリターの問題が発生し、JavaScriptで作成されたHTMLに強制的に二重引用符を使用させ、エスケープされていない二重引用符で属性を破壊しようとすることです。私はFirefoxとIEでこの問題に数年前に遭遇しました。
user2867288

16

HTMLフィールドの単一引用符はすべてのブラウザで認識されないという人の話を聞いたことがある

その人は間違っています。


30
必ずしも。HTMLフィールドの単一引用符を認識しないブラウザを数分で作成できます。もちろん、認識できないことはもっとたくさんあります...; P
オービットのライトネスレース

@LightnessRacesinOrbit「このブラウザがCSSをサポートしていないとはどういう意味ですか?!」
BadHorsie 2015

...またはもっと重要なことに、「そのブラウザ(そうではない)は死んだ肉」です。:P
ToolmakerSteve 2016

@LightnessRacesinOrbit-でもあなたは?ブラウザ全体を作成するのに十分な動機を持っている人は、シングルクォートを受け入れるようにするために、追加の5分を投入するようです。
user3413723 2018

7

インターネットで目にするものすべてを信じてはいけません...
おかしなことに、私は誰かがシングルクオートがXHTMLでは無効であると宣言しているのと同じようなことを答えました...

うーん、タイピング中に上を見ると、アダムNが同じ信念を伝えていることがわかります。もし彼が彼の断言を裏付けることができるなら、私は私が書いたものを撤回します...私の知る限り、XMLは不可知論であり、両方の種類の引用を受け入れます。一重引用符だけのXHTMLページを問題なく試し、検証しました。


4

問題は、データがTEXT INPUTフィールドに入力されることだけです。検討する

<input value='it's gonna break'/>

と同じ:

<input value="i say - "this is gonna be trouble" "/>

あなたはそれを逃れることはできません、あなたは使用しなければなりませんhtmlspecialchars


2
ただし行うことができます<input value='it&apos;s gonna break'/>
rink.attendant.6

4
一重引用符または二重引用符を使用するオプションがある理由は、このシナリオで文字をエスケープする必要がないようにするためだと思います。値に二重引用符しかない場合は、二重引用符を次のようにエスケープする必要がないように、単一引用符で囲みます。<input value="it's not gonna break"/>逆も同様です<input value='i say - "this is not gonna be trouble"'/>
Triynko 14

1
@Triynkoは正しいです。その上:コンテンツについては、そもそも「あいまいな引用」ではなく、「活版引用」を使用することを検討してください。ピーターのバーではなく、ピーターのバーです。☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
フランクNocke

2

これに関する情報をより新しいバージョンの仕様で見つけようとしていて、それを見つけるのにかなりの時間がかかったので、ここに示します。

から

HTML 5.3

エディターズドラフト、2018年10月18日

[...]

8.1.2.3。の属性

単一引用符で囲まれた属性値の構文

属性名、ゼロ個以上のスペース文字、単一のU + 003D EQUALS SIGN文字、ゼロ個以上のスペース文字、単一のU + 0027アポストロフィ文字( ')、属性値上記の属性値の要件に加えて、リテラルU + 0027 APOSTROPHE文字( ')を含めないでください。最後に、2番目の単一のU + 0027 APOSTROPHE文字(')を続けてください。

次の例では、type属性は単一引用符で囲まれた属性値の構文で指定されています。

<input type='checkbox'>

単一引用符で囲まれた属性構文を使用する属性の後に別の属性が続く場合、2つを区切るスペース文字が必要です。

http://w3c.github.io/html/single-page.html#elements-attributes


1

また、HTMLでは一重引用符を使用する傾向があり、問題を経験したことはありません。


1

私は、HTMLページで単一引用符を使用し、それにJavaScriptを埋め込みました。IE9、Chrome、Firefoxでテスト済み-正常に動作しているようです。

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
        <title>Bethanie Inc. data : geographically linked</title>
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js'></script>
        <script src='https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false' type='text/javascript'></script>
        <script type='text/javascript'> 
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                /////////////// Addresses ///////////////////
                var locations = new Array();
                var i = 0;
                locations[i++] = 'L,Riversea: Comp Site1 at Riversea,1 Wallace Lane Mosman Park WA 6012'
                locations[i++] = 'L,Wearne: Comp Site2 at Wearne,1 Gibney St Cottesloe WA 6011'
                locations[i++] = 'L,Beachside:Comp Site3 Beachside,629 Two Rocks Rd Yanchep WA 6035'

                /////// Addresses/////////
                var total_locations = i;
                i = 0;
                console.log('About to look up ' + total_locations + ' locations');
                // map options
                var options = {
                    zoom: 10,
                    center: new google.maps.LatLng(-31.982484, 115.789329),//Bethanie  
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    mapTypeControl: true
                };
                // init map
                console.log('Initialise map...');
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);
               // use the Google API to translate addresses to GPS coordinates 
               //(See Limits: https://developers.google.com/maps/documentation/geocoding/#Limits)
                var geocoder = new google.maps.Geocoder();
                if (geocoder) {
                    console.log('Got a new instance of Google Geocoder object');
                    // Call function 'createNextMarker' every second
                    var myVar = window.setInterval(function(){createNextMarker()}, 700);
                    function createNextMarker() {
                        if (i < locations.length) 
                       {
                            var customer = locations[i];
                            var parts = customer.split(','); // split line into parts (fields)
                            var type= parts.splice(0,1);    // type from location line (remove)
                            var name = parts.splice(0,1);    // name from location line(remove)
                            var address =parts.join(',');   // combine remaining parts
                            console.log('Looking up ' + name + ' at address ' + address);
                            geocoder.geocode({ 'address': address }, makeCallback(name, type));
                            i++; // next location in list
                            updateProgressBar(i / total_locations);


                        } else 
                       {
                            console.log('Ready looking up ' + i + ' addresses');
                            window.clearInterval(myVar);
                        }
                    }

                    function makeCallback(name,type) 
                   {
                        var geocodeCallBack = function (results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                var longitude = results[0].geometry.location.lng();
                                var latitude = results[0].geometry.location.lat();
                                console.log('Received result: lat:' + latitude + ' long:' + longitude);
                                var marker = new google.maps.Marker({
                                    position: new google.maps.LatLng(latitude, longitude),
                                    map: map,
                                    title: name + ' : ' + '\r\n' + results[0].formatted_address});// this is display in tool tip/ icon color
                                   if (type=='E')  {marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')};

-1

最近、Google検索の最適化で問題が発生しました。単一引用符がある場合、リンクされたページをクロールしないようです。


1
これは<a href=''>属性だけですか?
AntonChanning 2016年

-2

...または単にヒアドキュメントを使用します。その後、何かをエスケープすることについて心配する必要はありませんEND


PHPのヒアドキュメント機能について言及していると思います。
DavidRR 2014年

元の質問のコンテキストを考えると、なぜこの回答が反対票を投じられるのかわかりません。二重引用符と単一引用符の問題には直接回答しませんが、OPが最初に単一引用符を優先する原因となるphpエスケープ問題に対処します。ただし、使用例では問題ありません。
AntonChanning 2016年

-10

単一引用符はHTMLでは問題ありませんが、有効なXHTMLを作成しません。これは、HTMLではなくXHTMLのみをサポートするブラウザーを使用している人がいる場合、問題になる可能性があります。厳密なXHTMLを必要とするユーザーエージェントはおそらく存在しますが、そのようなブラウザは存在しないと思います。


さらに悪いのは、HTMLページを作成するが、「より良い」のでXHTMLとしてマークを付ける人です。幸いにもこの流行は減少しているようです。
ハビエル

4
XHTMLに関するこの説明が正しいとは思いません。"と 'の両方がXMLで受け入れられ、W3Cバリデーターは単一引用符で囲まれた属性を持つXHTMLドキュメントを受け入れます。おそらくこれは、HTMLで正当な引用符で囲まれていない属性を削除するXHTMLと混同しているのでしょうか?
Doug McClean

ページをtext / xhtmlとして提供し、text / htmlブラウザーではなくHTMLとしてレンダリングしない限り、HTMLルールが適用されます。とにかく、w3C原則の1つは、ウェブを壊すことではありません。現在動作しているため、明日動作する可能性があります。
Diodeus-James MacFarlane 2008年

8
XHTMLでは、ページを整形式のXMLにする必要があります。XMLでは、属性を二重引用符または単一引用符で囲むことができます。
Ned Batchelder

@SoftwareMonkey実際には、application/xhtml+xmlまたはが必要application/xmlです。
rink.attendant.6 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.