Php Regex - 如果等于某事,如何选择

时间:2016-07-29 09:29:10

标签: php regex pdf

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代码区域可以播放。 Dompdf处理其余部分以将表单转换为pdf。这个类代码几乎是预制的。它让我可以自由使用;

 {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);

它有效但当然没有自由(只有当无线电等于英语时)。我对正则表达式这么新,所以我无法弄明白。我试图添加$ equality变量,所以我会使用不同的检查多次使用我的代码;

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可能会获得第三个数组。所以我也尝试添加这个但是也没有用;

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

        $placeholder = $match[1];  

        $equality   =  $match[2];     

        $content    = $match[3];

我的目标是将检查图标放在预制设计的表单图像上的特定框区域。我处理了所有具有绝对位置的文本框,除了选中哪个单选按钮。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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个以上选项的单选按钮。但在我的情况下,我的所有单选按钮都有2个选项。

到目前为止,我今天学到了正则表达式:)