2016-05-21 7 views
0

おはよう正規表現、タグはコンテンツではありません

私はテンプレートクラスで作業しています。 私はそうのようなTPLファイル内の条件を行います:条件が偽であるとき私は@if('eee' == 'esee')@endifを削除しますが、私は方法がわからない、すべての隠された仕事が、whan該当する

@if('eee' == 'esee') 
    <h2>Test</h2> 
@endif 

@if('aaa' == 'aaa') 
    <h2>Test</h2> 
@endif 

。私はコンテンツなしでタグを削除することができますどのようにここに

私の機能

private static function get_condition(){ 
    $control = array(); 
    preg_match_all('/@if\((?P<control>[^)]+)\)/', self::$viewMainContent, $control); 
$matches = isset($control['control']) ? count($control['control']) : 0; 
for($i = 0; $i < $matches; $i++) { 
     $operators = [' == ', ' != ', ' >= ', ' <= ', ' > ', ' < ']; 
     foreach($operators as $operator){ 
      if(preg_match('/'.$operator.'/', $control['control'][$i])){ 
       $val = explode($operator, $control['control'][$i]); 
       $param = preg_grep('/\'[^"]*\'/is', $val, PREG_SET_ORDER); 
       $show = false; 
       if(count($param) == 2){ 
        switch(trim($operator)){ 
         case "==": 
          if($param[0] == $param[1]){ $show = true; } 
          break; 
         case "!=": 
          if($param[0] != $param[1]){ $show = true; } 
          break; 
         case ">=": 
          if($param[0] >= $param[1]){ $show = true; } 
          break; 
         case "<=": 
          if($param[0] <= $param[1]){ $show = true; } 
          break; 
         case ">": 
          if($param[0] > $param[1]){ $show = true; } 
          break; 
         case "<": 
          if($param[0] < $param[1]){ $show = true; } 
          break; 

        } 
       } 

       self::$viewMainContent = str_replace("\n", " ", self::$viewMainContent); 
       if(!$show){ 
        self::$viewMainContent = preg_replace('/'.preg_quote($control[0][$i]).'(.*?)\@endif/', '', self::$viewMainContent); 
       } else { 
        //self::$viewMainContent = preg_replace('/'.preg_quote($control[0][$i]).'/', '', self::$viewMainContent); 
        //self::$viewMainContent = preg_replace('/@endif/', '', self::$viewMainContent); 
       } 
      } 
     } 
} 
} 

Thxを

+1

多分[strip_tags](http://php.net/manual/en/function.strip-tags.php)は助けることができます – bugwheels94

+0

私はこれをどうしなければならないのか分かりません。私はtplで複数の条件があり、私は本当の条件からタグを削除したいだけです。 strip_tagsを使用すると、すべてのタグのみを削除できます。 または間違っていますか? – Neonlight

答えて

0

これは本当にを確保できないですが、私は簡単のため、ここでeval()を使用。ロジックをswitch() caseロジックに置き換えることができます。ここでdemoある

$template = <<<'EOD' 
@if('eee' == 'eee') 
    <h2>Test</h2> 
@endif 

@if('aaa' == 'aaa') 
    <h2>Test</h2> 
@endif 
EOD; 

$regex = '/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\s\/\<\>\w\n]*))@endif/m'; 

preg_match_all($regex, $template, $matches); 

$template = preg_replace_callback(
    $regex, 
    function ($matches) { 
     if (eval('return ' . $matches['condition'] . ';')) { 
      return rtrim($matches['content']); 
     } 

     return ''; 
    }, 
    $template 
); 

var_dump($template); 

:私はあなたが欲しいものを行うための方法の一つがpreg_replace_callback()ていると思います。

'/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\s\/\<\>\w\n]*))@endif/m' regex hereでも試すことができます。

+0

この回答ありがとうございます。 しかし、私はTplの '

test
' それはdosnt関数で記述します。 – Neonlight

+0

@Neonlightこれを解決するには、正規表現に\\ \ \を追加します。私は答えを更新しました。 – sevavietl

+0

ありがとうございました 正規表現のパターンを知る良いサイトを知っていますか? – Neonlight

関連する問題