通常我会将HTML属性与此正则表达式匹配
\w+=".*?"
但是当HTML包含PHP代码时,它会变得很糟糕。请考虑以下标记:
<option value="<?php echo $img; ?>"<?php echo ($hpb[$i]['image_filename']==$img?' selected="selected"':''); ?>>
<?php echo $img; ?>
</option>
上面的正则表达式将匹配在PHP逻辑中确定的属性selected="selected"
。有没有办法匹配不在PHP标签内的属性,同时仍然匹配其值可能包含PHP逻辑的属性?如果没有,我可以删除不属于属性值的PHP代码吗?
编辑:这是我到目前为止所拥有的:
\w+="(((.(?!<\?php))*?)|((.((?=<\?php).*?(?=\?>))*)*?))*"
这基本上意味着匹配以SPACE开头的字符串,然后贪婪地匹配字母数字字符,然后是EQUALS符号,后跟双引号,然后匹配以下两个中的任何一个,同时捕获尽可能多的字符:
<?php
<\?php.*?\?>
的字符序列,或者换句话说,该属性的值部分与其所有PHP代码贪婪地匹配
所有这一切直到收到双重报价...... 答案 0 :(得分:0)
/<\?php[\s\S]*?\?>|\s+(\w+)="([^"<]*(?:<\?php[\s\S]*?\?>[^<"]*)*)"/
这将匹配 PHP代码段或一个完整的attribute="value"
序列,其中值可能包含PHP代码。在每次比赛后,您可以通过检查捕获组的内容来找出您捕获的内容。如果它是您匹配的纯PHP段,则group[0]
以外的所有段都将为空;否则,group[1]
将包含属性名称,group[2]
将包含值。
正则表达式假设<
将作为<?php
标记的开头显示在属性值中中。当然,这不是一个语法上有效的假设,但它无论如何都可能是安全的。如果你需要我,我可以使正则表达式更精确,但它的可读性也会低得多。