質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • HTML

    9000questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

記号が区切り文字になるものを探しています

受付中

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 708

lazex

score 411

すごく曖昧な質問になってしまうのですが、たぶん HTML 周りのもので、

「本来の区切り文字ではないが、記号など使えない文字が来たら区切り文字として扱われる」

という仕様(実装がそうなっているだけかも)が何処かにあったと思います。

1,2年程度前にネットで見かけてそうなんだーと思った記憶はあるのですが、試してはないはずで、今回ふとしたキッカケでそれを思い出して試そうと思いました。


class 属性で、 "a;b#c" が "a b c" のようになるのだったかな?
と思って試してみましたが、違うようです。

;["a,b", "a|b", "a#b", "a!b"].forEach(className => {
    document.body.innerHTML = ""

    document.body.append(
        Object.assign(
            document.createElement("div"),
            {className}
        )
    )

    console.log(className)
    console.log(document.querySelectorAll(".a").length)
    console.log(document.querySelectorAll("." + CSS.escape(className)).length)
})
a,b
0
1
a|b
0
1
a#b
0
1
a!b
0
1

a だけだとマッチせず、記号も含めた場合にマッチしています。

調べてみたら HTML4 の頃から記号も使えるらしく、最近の変更ということではないようです。

他に区切り文字があって、複数書くことができ、記号が使えない(区切り文字になる)ものが思いつかないのですが、何か心当たりはないでしょうか?

ここ数日気になって調べてるのですが、それらしいものが全然見つかりません。


確実と不確定な部分をわけてまとめると、

・確定

  • 上記で間違いだった class 属性のような、文字列を記述するもの
  • その文字列は何かの文字列で区切ることができる
  • class をスペースで区切るような一般的な区切り文字がある
  • フリーテキストと違って記号など来れないものがある
  • その場合に来れないものが区切りとして扱われる
  • それらは通常は区切りとして用いない
  • それなりに知識がある方と思っていたのに知らなかったので驚いた(絶対的な指標はないですが、初心者ではない分野でそれを知らずに困らなかった、というくらいで考えてもらえばいいです)

・不確定

  • HTML 関係(web関係で、サーバサイドは関係ないはず)
  • 区切り文字はスペースじゃないかも
  • 日本語は区切りになるのか、文字になるか不明
  • 使えない記号がどれか、セレクタみたいな特殊な意味のある記号があったか
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

もしかして、これ?


HTMLでは、文字を表すのに「実体参照」を使えます。「&名前;」といった形式の表記です。<のように、HTMLの特殊文字とかぶる文字を表すのによく使いますね。

HTML4までの規格はSGMLに準拠していたので、実体参照の書式もそれに準拠していました。SGMLでは、まぎれがなければ実体参照の最後の;を省略していいことになっています。

そのため、注意しないと問題が起きることがあります。たとえばHTML中に次のような記述があった場合、

<a href="?art&copy">Art and Copy</a>

&copy」は、その後に名前に使えない文字"があるため、「copy」という名前の実体参照&copy;として扱われます。その結果この記述は

<a href="?art©">Art and Copy</a>

を表すものと解釈できてしまいます。

HTML5からはSGMLに準拠しなくなったので、実体参照の書式があらためられ、最後の;は必須となりました。文書に上記のような記述があれば、構文エラーとなります (HTML5.1, §1.10.2. Syntax errors「Errors involving fragile syntax constructs」.)。

上記の例での正しい方法は、URI中の「&」を次のように実体参照として記述することです。

<a href="?art&amp;copy">Art and Copy</a>

 おまけ

上で説明した問題はHTML4でも指摘されていましたが、HTML4までは上述のとおり;を省略できてしまっていたので、解決策としてURIのクエリの区切り文字に&ではなく;を使うことを推奨していました (HTML4.01, Appendix B.2.2. Ampersands in URI attribute values)。

実際、URIの構文解析をするモジュールなどは、多くが両方の区切り文字に対応しています。;を使えるフレームワークもあります。ただし、URIのクエリ部はサーバサイドで解析されるものなので、サーバサイドで対応していない区切り文字は認識できません。

たとえばQiitaでは、次のいずれでも検索ができます。

  1. https://qiita.com/search?sort=stock&q=qiita
  2. https://qiita.com/search?sort=stock;q=qiita

しかしTeratailでは、1. では検索できますが2. は期待通りに動作しません。

  1. https://teratail.com/questions/search?search_type=and&q=teratail
  2. https://teratail.com/questions/search?search_type=and;q=teratail

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:00

    へぇー実体参照にはそんな歴史があったんですか。知りませんでした。

    ということで探してたものじゃないです。
    でもすごくためになりました。

    「区切り文字」ですが、 この実態参照やPHPの変数展開で{}がいるか、みたいなタイプのものではなく、複数書くときに分けるための区切り文字だったはずです

    キャンセル

  • 2017/02/13 00:19

    最初は「おまけ」に書いた方の話かな、と思い、裏をとるために調べてHTML5で変わったことに気づきました。セミコロンを省略できたなんて今まで知らなかったよ (実際に実装されていたかどうかは別の話ですが)。勉強になりました。

    というコメントまで用意していたんですが、違いますかそうですか(笑)。うーん、なんだろう。

    キャンセル

0

Google 検索のキーワードとかじゃないですか?
曖昧な表記を許すならプログラミングなどの機械向け言語の仕様ではなく人間向けだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:05

    人が書くものではなく、プログラム的なものです。これは確信あります。

    ただ決められたキーワードから選んで書くのではなく、変数名やクラス名みたいな自分で名前つけることはできたように思います。

    キャンセル

0

過去に見かけたものが何なのかはともかくとして、業務又はシステム仕様に合わせればいいのではないでしょうか。

業務またはシステムで使うデータに出現しない文字または複数の文字から構成される文字列を区切り文字にすればいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:01

    作ってるものの仕様で困ってるわけではなく、記憶にあるのに全然見つからなくて気持ち悪い
    ▶teratailなら知ってる人いるかも。
    という意図での質問です

    キャンセル

-1

ちょっと書いてあることがよくわからなかったので、的はずれな気もしますが、
「本来の区切り文字ではないが、記号など使えない文字が来たら区切り文字として扱われる」
という表現から、DBにおける utf8 の表現を思い出しました。
うまく説明しにくいのですが、絵文字が入ると、それを区切りとして後ろが抜け落ちるというものです。

MySQL で utf8 と utf8mb4 の混在で起きること

参照先もちょっとわかりにくいです^^;
html の内容を php 等で DB から拾ってくる時、接続が utf8 でカラムが utf8 だと、絵文字以降が抜け落ちます。
美味しい🍣と🍺 → 美味しい
無くなってしまうので、区切りではないかもしれないですが^^;

utf8 と utf8mb4 との比較で調べると、もう少し詳しい内容が確認できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:03

    それ聞いたことあります。

    ただ今回探してるものとは違います。
    DB関係は全く関係ないはずです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • HTML

    9000questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。