
[code]

    <?php
    $content = <<<'EOD'
    <pre class="prettyprint linenums">
    <?php
    if($hoge == 'hoge') {
      echo 'hoge!';
    }
    <span class="nocode">text</span>
    </pre>
    ?>
    EOD;
    ?>
    
[/code]

といったソースコードを Wordpress に表示させるとき、ソースコードの部分を `htmlspecialchars` で実体参照変換して表示させる。  
しかし、ソースコード内に注釈を入れる場合は `<span class="nocode"> 注釈 </span>` を利用したい。  
`<span class="nocode"> 注釈 </span>` に対しては実体参照変換をせずに表示したい。  
もしくは、`<span class="nocode">` から始まる行は実体参照変換せずに表示したい。  
もしくは、`$content` を実体参照変換した後に `<span class="nocode">`~`</span>` の行を
`htmlspecialchars_decode` する。

## 現状

`preg_replace_callback` で `$content` 内の文字列を抽出、置換

[code]

    $content = preg_replace_callback(
      '/<pre(.*?)>(.+?)\<\/pre\>/s',
      function ($matchese){
        return htmlspecialchars($matchese[2], ENT_QUOTES, 'UTF-8');
      },
      $content
      );
    
[/code]

`$content` を `var_dump` すると

[code]

    string(131) "
    &lt;?php
    if($hoge == &#039;hogeho&#039;) {
      echo &#039;hoge&#039;;
    }
    &lt;span class=&quot;nocode&quot;&gt;nocode&lt;/span&gt;
    
    ?>"
    
[/code]

と、中身を実体参照変換することができました。

`<span class="nocode"> 注釈 </span>` がソースコード内に入っていない場合はいいのですが、入っている場合のみ、 `<span
class="nocode"> 注釈 </span>` の部分だけを変換したくありません。

この場合はどのようにしたらいいでしょうか？

ご回答お待ちしております。


CC BY-SA 3.0
2015-08-12T16:46:02.013
14335
2016-04-13T16:01:55.120
2015-08-12T17:11:12.743
10741
10741
question
php
preg_replace_callback 内にて、if 文で条件分岐をした処理を書きたい


コールバック:

[code]

    $content = preg_replace_callback(
        '/(<pre.*?>)(.+?)(<span.*?>.*?<\/span>.*)?(<\/pre\>)/s',
        function ($matchese) {
            $h = $matchese[1];
            $h .= htmlspecialchars($matchese[2], ENT_QUOTES, 'UTF-8');
            $h .= $matchese[3];
            $h .= $matchese[4];
            return $h;
        },
        $content
    );
    
    var_dump($content);
    
[/code]

注釈あり入力:

[code]

    <?php
    $content = <<<'EOD'
    <pre class="prettyprint linenums">
    <?php
    if($hoge == 'hoge') {
      echo 'hoge!';
    }
    <span class="nocode">text</span>
    </pre>
    ?>
    EOD;
    
[/code]

注釈あり出力:

[code]

    string(146) "<pre class="prettyprint linenums">
    &lt;?php
    if($hoge == &#039;hoge&#039;) {
      echo &#039;hoge!&#039;;
    }
    <span class="nocode">text</span>
    </pre>
    ?>"
    
[/code]

注釈なし入力：

[code]

    <?php
    $content = <<<'EOD'
    <pre class="prettyprint linenums">
    <?php
    if($hoge == 'hoge') {
      echo 'hoge!';
    }
    </pre>
    ?>
    EOD;
    
[/code]

注釈なし出力:

[code]

    string(114) "<pre class="prettyprint linenums">
    &lt;?php
    if($hoge == &#039;hoge&#039;) {
      echo &#039;hoge!&#039;;
    }
    
    </pre>
    ?>"
    
[/code]


CC BY-SA 3.0
2016-04-13T16:01:55.120
23994
2016-04-13T16:01:55.120
15010
14335
answer