0

私はこの preg_replace パターンと置換を持っています:

$patterns = array(
    "/<br\W*?\/>/",
    "/<strong>/",
    "/<*\/strong>/",
    "/<h1>/",
    "/<*\/h1>/",
    "/<h2>/",
    "/<*\/h2>/",
    "/<em>/",
    "/<*\/em>/",
    '/(?:\<code*\>([^\<]*)\<\/code\>)/',
);
$replacements = array(
    "\n",
    "[b]",
    "[/b]",
    "[h1]",
    "[/h1]",
    "[h2]",
    "[/h2]",
    "[i]",
    "[/i]",
    '[code]***HTML DECODE HERE***[/code]',
);

私の文字列ではhtml_entity_decode、これらのタグの間のコンテンツが必要です: <code> &lt; $gt; </code>しかし、preg replace の配列構造を保持します

だからこれ:これ<code> &lt; &gt; </code>になります:[code] < > [/code]

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

1

これを置換文字列にエンコードすることはできません。preg_replace_callbackPoloRMが提案したように、代わりに最後の交換に特に使用できます。

function decode_html($matches)
{
    return '[code]'.html_entity_decode($matches[1]).'[/code]';
}

$str = '<code> &lt; &gt; </code>';
$str = preg_replace_callback('/(?:\<code*\>([^\<]*)\<\/code\>)/', 'decode_html', $str);

同様に、以下を使用しcreate_functionます。

$str = preg_replace_callback(
    '/(?:\<code*\>([^\<]*)\<\/code\>)/',
    create_function(
       '$matches',
        'return \'[code]\'.html_entity_decode($matches[1]).\'[/code]\';'
    ),
    $str
);

または、PHP 5.3.0以降:

$str = preg_replace_callback(
    '/(?:\<code*\>([^\<]*)\<\/code\>)/',
    function ($matches) {
        return '[code]'.html_entity_decode($matches[1]).'[/code]';
    },
    $str
);

ただし、3つのケースすべてで、パターンが実際には最適ではないことに注意してください。<まず、それらをエスケープする必要はありません>(ただし、これは読みやすさのためだけです)。第二に、あなたの最初*のものは文字の無限の繰り返し(または省略)を可能にしますe。属性を許可したいと思います。第三に、他のタグを自分の中に含めることはできません<code>[^<]それらと一致しないため)。この場合、代わりに貪欲でない繰り返しを使用する必要があります(便宜上、区切り文字も変更しました)。

~(?:<code[^>]*>(.*?)</code>)~

すでにお分かりのように、これはまだ完璧にはほど遠いです(そもそもHTMLと正しく一致するという点で)。したがって、必須の注意事項:HTMLの解析に正規表現を使用しないでください。DOMパーサーを使用すると、はるかに効果的です。PHPには組み込みのものがあり、この非常に使いやすいサードパーティ製のものもあります。

于 2012-10-29T09:06:57.377 に答える
0

これをチェックしてください:

http://www.php.net/manual/en/function.preg-replace-callback.php

マッチに html_entity_decode 機能を適用するコールバック関数を作成できます。

于 2012-10-29T08:06:29.420 に答える