2011-07-29 17 views
1

IF文でpreg_matchを使用しようとしています。文字列にいくつかのテンプレート関数が含まれていない場合はfalseを返します。正規表現は、コードのフォーマットと一致した場合今、私は真を返すように、この時点でpreg_match文を希望php regex preg_match特定のキーワードのみを許可する

{function="nl2br($value.field_30)"} 
{function="substr($value.field_30,0,250)"} 
{function="addslashes($listing.photo.image_title)"} 
{function="urlencode($listing.link)"} 
{function="AdZone(1)"} 

は、これらは、HTMLなど

ので混在しているが、didnの:ここでは

は、いくつかの例テンプレートの機能が許可されています「Tは、許可された機能のキーワードのいずれかが含まれています。

if (preg_match('(({function=)(.+?)(nl2br|substr|addslashes|urlencode|AdZone)(.+?)\})',$string)) { 
    // found a function not allowed 
} else { 
    // string contains only allowed functions or doesn't contain functions at all 
} 

誰もがこれを行う方法を知っていますか?

+2

ないpreg_quoteをスキップするが、その後は単に関数名が台無しは最終パターン(例えば、配列を破前preg_quoteを介して関数名を実行する)可能性があるものが含まれていないことを確認してくださいツール。おそらくそれらは古い学校の古いトークナイザとパーサと組み合わせることができます: - ?しかし、機能の潜在的なリスクにかかわらず、問題は素晴らしいです。 –

+0

私はそれを行うつもりでしたが、コードをきれいに保つために、私はここで簡単なif文の解決策を最初に尋ねると思っていました。 – Joe

答えて

0

ないあなたはここにしようとしているが、私は(場合によっては、関数名)単語のリストにマッチした正規表現を作成した場合、私は

// add/remove allowed stuff here 
$allowed = array('nl2br', 'substr', 'addslashes'); 

// make the array into a branching pattern 
$allowed_pattern = implode('|', $allowed); 

// the entire regexp (a little stricter than yours)  
$pattern = "/\{function=\"($allowed_pattern)\((.*?)\)\"\}/"; 

if(preg_match($pattern, $string, $matches)) { 
    # string DOES contain an allowed function 
    # The $matches things is optional, but nice. $matches[1] will be the function name, and 
    # $matches[2] will be the arguments string. Of course, you could just do a 
    # preg_replace_callback() on everything instead using the same pattern... 
} else { 
    # No allowed functions found 
} 
のように気にいらないにしてください何をかなり確実

$allowed配列は、許可された関数名の追加と削除を容易にします。正規表現では、中括弧、引用符、および一般的な構文が厳しくなります。これはおそらく良い考えです。

まず、if..elseブランチを反転するか、!を使用してください。 preg_matchは、文字列内のものと一致するものであり、そこにないものと一致するものではありません。だから、本当にそれはではない何かのためtrueを返すために取得することはできませんが

それでも、アルバロが述べたように、おそらくこれについて移動する最良の方法はありません、持っているかなり危険である正規表現コードの残りの部分に関係なく、そのように公開された関数。単語をマッチさせるだけであればうまくいくはずですが、それは任意の引数を持つ関数呼び出しなので...うまくいきます。私は本当にそれをお勧めすることはできません:)

編集:最初に、私はpreg_quoteを使用して爆縮された文字列が、もちろんパイプ文字をエスケープし、パターンは動作しません。正規表現がベストか確認

+0

これは動作します!ありがとう! – Joe

関連する問題