2016-06-26 20 views
1

githubでホストされているオープンソースプロジェクトを実行しています。私は現在PHP 7で動いている新しいバージョンをリリースしようとしています。これは私が助けを必要としているところです。私はかなりのPHP関数の大部分を持っていて、mysqliも同様に快適ですが、自分のプロジェクトを実行している間は、正規表現を使ったことは一度もありませんでした。私は現在使用していない/e修飾子を使用して2つのパターンを持っており、それらを修正する方法はわからないので、実際に何かを学び、私の問題を解決するためにここで質問してほしいと思っています。/e修飾子は非推奨です

問題が発生しましたpreg_replace私はコードタグ用のGeshi構文ハイライターに使用しました。

// [php]code[/php] 
 
    if (stripos($s, '[php]') !== false) { 
 
    $s = preg_replace("#\[(php|sql|html)\](.+?)\[\/\\1\]#ise", "source_highlighter('\\2','\\1')", $s); 
 
}

もう一つはliveleakのなどのようなメディアのタグを処理します。

if (stripos($s, '[media=') !== false) { 
 
    $s = preg_replace("#\[media=(youtube|liveleak|GameTrailers|vimeo|imdb)\](.+?)\[/media\]#ies", "_MediaTag('\\2','\\1')", $s); 
 
    }

は両方とも働いて、このエラー投げされていません。

PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead.

問題正規表現を使って作業する方法がわかりません。過去数週間にわたってチュートリアルを試してみましたが、実際には理解できません。

答えて

1

PHPマニュアルは、このように修飾子について説明します。すべての(強調鉱山)

If this deprecated modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, eval s it as PHP code(!!), and uses the result for replacing the search string. Single quotes, double quotes, backslashes() and NULL chars will be escaped by backslashes in substituted backreferences.

まず、この修飾子の概念そのものは常に悪でした。それはソースコードにevalのケースを含んでいましたが、その存在は通常は見過ごされていたため、かなり容易に悪用されました。

オンラインのPHPドキュメント... http://php.net/manual/en/reference.pcre.pattern.modifiers.php ...この修飾子について、なぜそれが悪いのか、具体的にはどのようにpreg_replace_callback()を使用して置き換えるのかについて非常に幅広く語ります。正規表現は、文字列に対して評価とされた後

$s = preg_replace_callback(
    "#\[(php|sql|html)\](.+?)\[\/\\1\]#ise", 
    function($subs) { 
     return source_highlighter($subs[2], $subs[1]); 
    }, 
    $s); 

のは、あなたの最初の正規表現、「Geshi構文」のための1つを見てみましょう:

$s = preg_replace(
    "#\[(php|sql|html)\](.+?)\[\/\\1\]#ise", 
    "source_highlighter('\\2','\\1')", 
    $s); 

これは、のようなもので置き換えることができます一致するグループ(存在する場合)が特定されている場合、配列はコールバックに渡されます。 (配列は、通常の一致によって返される配列のように見えます)。コールバックによって返される値は、最後の置換文字列です。

次に、実行サブルーチンの存在が明示賢いL33T H4X0Rはそれから成るもの影響を及ぼすために、または任意のコードを注入することができなくなるとしています。

さらに、柔軟性に優れています。結局、サブルーチン全体を挿入することができます。 (これは、匿名のものとすることもできますし、何回も使用されているサブルーチンへの参照になることもあります)。)

率直に言えば、/e修飾子は、という悪いのアイデアでした。 。 。コールバックは同じことをします。

+0

詳細なお返事ありがとうございました。マイクは、私を大きく助けました。両方のタグがエラーなしで機能しています。私は重複した回答のいくつかを見ていたが、何も成功しなかった、もう一度感謝! – Bigjoos

+0

'\\ 2'と '\\ 1'は$ subs [1]と$ subs [0]に変換され、2と1ではありません。 – Ionut