2016-07-29 9 views
4
class Something 

{ 

    public static function compile(&$subject, $replace, $with) { 

     $placeholders = array_combine($replace, $with); 



     $condition = '{[a-z0-9\_\- ]+:[a-z_]+}'; 

     $inner  = '((?:(?!{/?if).)*?)';  

     $pattern = '#{if\s?('.$condition.')}'.$inner.'{/if}#is'; 



     while (preg_match($pattern, $subject, $match)) { 

      $placeholder = $match[1];   

      $content  = $match[2]; 



    // if empty value remove whole line 

    // else show line but remove pseudo-code 

    $subject = preg_replace($pattern, 

          empty($placeholders[$placeholder]) ? '' : addcslashes($content, '$'), 

          $subject, 

          1); 

     } 

    } 

} 

私は、再生するHTMLコードエリアを持っています。私のフォームをpdfに変換するために、Dompdfが残りを処理します。このクラスコードはほぼ完成していました。それは私に自由を与える。PHP正規表現 - 等しいかどうかを判断する方法

{if {dil:value}} <div class="english">ENGLISH</div> {/if} 

html領域のようなものです。しかしラジオボタンが空であるかどうかだけをチェックしていました。しかし、どのオプションが選択されているかを知りたい。だから私は次のようなコードを使用したい。

{if {dil:value}=='ENGLISH'} <div class="english">ENGLISH</div> {/if} 

空のチェックラインを手動の等価チェックで変換して動作するかどうかを確認しました。

 // if empty value remove whole line 

     // else show line but remove pseudo-code 

     $subject = preg_replace($pattern, 

           $placeholders[$placeholder]=='english' ? '' : addcslashes($content, '$'), 

           $subject, 

           1); 

これは機能しましたが、もちろん自由です(ラジオが英語に等しい場合のみ)。私は正規表現にはとても新しいので、私はそれを理解することができませんでした。私は$等価変数を追加しようとしましたので、私は自分のコードをさまざまな検査で何度も使用します。

class Something 

{ 

    public static function compile(&$subject, $replace, $with) { 

     $placeholders = array_combine($replace, $with); 



     $condition = '{[a-z0-9\_\- ]+:[a-z_]+}'; 

     $inner  = '((?:(?!{/?if).)*?)'; 

     $equality = '(?<=~)[^}]*(?=~)'; 

     $pattern = '#{if\s?('.$condition.')'.$equality.'}'.$inner.'{/if}#is'; 



     while (preg_match($pattern, $subject, $match)) { 

      $placeholder = $match[1];   

      $content  = $match[2]; 



      // if empty value remove whole line 

      // else show line but remove pseudo-code 

      $subject = preg_replace($pattern, 

            $placeholders[$placeholder]==$equality ? '' : addcslashes($content, '$'), 

            $subject, 

            1); 

     } 

    } 

} 

このコードはhtml領域にあります。

{if {dil:value}~'ENGLISH'~} <div class="english">ENGLISH</div> {/if} 

私は実際にそれがうまくいくと信じていますが、私はpdfファイルの下で私のコードを読むことができるので、それもパターン:)をしていないPDFに変換した後に消去されませんでした。

$ matchについても何か不足している可能性があります。等価変数が含まれているので、$ matchは3番目の配列を取得する可能性があります。だから、私もこれを追加しようとしましたが、うまくいきませんでした。

while (preg_match($pattern, $subject, $match)) { 

     $placeholder = $match[1]; 

     $equality = $match[2];  

     $content = $match[3]; 

私の目標は、デザイン済みのフォームイメージ上の特定のボックス領域にチェックアイコンを配置することです。私はどのラジオボタンがチェックされているかを除いて絶対位置ですべてのテキストボックスを扱った。

ありがとうございました。

答えて

0

私はこれをこのように解決しました。

class Something 
{ 

    public static function compile(&$subject, $replace, $with) { 

     $placeholders = array_combine($replace, $with); 



     $condition = '{[a-z0-9\_\- ]+:[a-z_]+}'; 

     $inner  = '((?:(?!{\/?if).)*?)'; 

     $equality = '(~[A-ZÇŞĞÜÖİçşğüöı]+~)'; 

     $pattern = '#{if\s?('.$condition.')}'.$equality.''.$inner.'{\/if}#is'; 



     while (preg_match($pattern, $subject, $match)) { 

      $placeholder = $match[1];   

      $equality = $match[2]; 

      $content  = $match[3]; 

      $equality = substr($equality, 1, -1); 

      // if empty value remove whole line 

      // else show line but remove pseudo-code 

      $subject = preg_replace($pattern, 

            $placeholders[$placeholder] == $equality ? '' : addcslashes($content, '$'), 

            $subject, 

            1); 

     } 

    } 

} 

私はUtf-8文字をサポートするように平等正規表現を変更し、他の正規表現を少し変更しました。シェイプされていないスラッシュはありませんでした。そして、ついにこれをhtmlで使うことができます。

{if {language:value}}~FRENCH~<div class="english">ENGLISH</div>{/if} 

したがって、最初の一致はラジオボタンの値を取得し、2番目の一致は私の等価チェックであり、3番目の一致は等価が間違っている場合に書き込まれます。うん、私は少し反転モードで聞こえることを知っている:)それはおそらく2つ以上のオプションを持つラジオボタンで動作しません。しかし、私の状況では、私のラジオボタンには2つの選択肢があります。

これまでのところとても良い、私はちょっと今日の正規表現を学んだ:)

関連する問題