

**マークダウンで「引用」**  
・先頭に>を記述

[code]

    > 引用  
    
[/code]

* * *

**Q**  
・上記を含むマークダウン文字列を「HTMLエスケープ」後「HTML変換」するには、どうすれば良いでしょうか？

* * *

**試したこと**  
・変換を避ける方法を思いつかなかったため、変換後、先頭が「`"&gt;"`」の場合「">"」へ戻そうと思ったのですが、うまくいきません

[code]

    $targetStr = "> 引用マークダウンはなぜこの記号なの？";
    preg_replace("/^&gt;/", ">", htmlspecialchars($targetStr, ENT_QUOTES, 'UTF-8'));
    
[/code]


CC BY-SA 3.0
2017-08-08T11:10:47.220
37018
2019-01-20T00:02:25.470
2017-08-10T00:26:52.140
7886
7886
question
php markdown
マークダウンで「> 引用」を、HTMLエスケープ後、<blockquote>へHTML変換したい


**注:
これは質問の[以前のリビジョン](https://ja.stackoverflow.com/revisions/37018/3)に対する回答です。**

### `<blockquote>` が正常変換されない理由

  1. 元々の Markdown
[code]     > 対象文字列

    
[/code]

  2. エスケープ後の文字列
[code]     &gt; 対象文字列

    
[/code]

  3. HTML へ変換
[code]     <p>&gt; 対象文字列</p>

    
[/code]

2の手順が挟まることで Markdown の「> ...」という引用記法が適用されなくなり、`<blockquote>`
へ変換されなくなった、というわけです。

[htmlspecialchars](http://php.net/manual/ja/function.htmlspecialchars.php)で変換されうる文字は「&,
", ', <, >」のみなので、「#」を使うことになる装飾は影響を受けません。

  1. 元々の Markdown
[code]     ### 対象文字列

    
[/code]

  2. エスケープ後の文字列
[code]     ### 対象文字列

    
[/code]

  3. HTML へ変換
[code]     <h3>対象文字列</h3>

    
[/code]

### エスケープしつつ `<blockquote>` 相当の装飾を正しく変換する方法

cebe/markdown 自体は内部で入力文字列を eval している訳ではないと思う (確認をお願いします) ので、エスケープは Markdown から
HTML に変換した後で良いのではないでしょうか。

[「脆弱性対策におけるhtmlspecialchars()の使用箇所について」](https://ja.stackoverflow.com/q/2408/19110)もご参照下さい。

余談ですが、cebe/markdown の [#106](https://github.com/cebe/markdown/issues/106) や
[#116](https://github.com/cebe/markdown/issues/116) では、XSS 対策のために HTML
Purifier を勧めています。


CC BY-SA 3.0
2017-08-10T00:03:53.867
37077
2017-08-10T00:35:50.073
2017-08-10T00:35:50.073
19110
19110
37018
answer


> マークダウン文字列を「HTMLエスケープ」後「HTML変換」するには、どうすれば良いでしょうか？

  * markdownにはHTML断片を含むことができる
  * `>` などHTML上意味があるがmarkdown文法でも使われている文字が存在する

ので、markdownを変換する前にHTMLエスケープをしてはいけません。

HTMLタグを取り除きたいのであれば、

  * markdownパーサの機能を使う
  * markdownパーサのコールバック処理などを使って自分で書く
  * 変換後のHTMLをDOM操作する

などの方法が考えられます。


CC BY-SA 3.0
2017-08-27T06:36:10.360
37521
2017-08-27T06:36:10.360
5793
37018
answer