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];
我的目标是将检查图标放在预制设计的表单图像上的特定框区域。我处理了所有具有绝对位置的文本框,除了选中哪个单选按钮。
感谢您的帮助。
答案 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个选项。
到目前为止,我今天学到了正则表达式:)