正则表达式匹配HTML标记内的属性,可能包括PHP代码

时间:2011-11-08 08:43:37

标签: javascript html regex match

通常我会将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符号,后跟双引号,然后匹配以下两个中的任何一个,同时捕获尽可能多的字符:

  1. 不包含字符串<?php
  2. 的字符序列
  3. 包含模式<\?php.*?\?>的字符序列,或者换句话说,该属性的值部分与其所有PHP代码贪婪地匹配 所有这一切直到收到双重报价......

1 个答案:

答案 0 :(得分:0)

/<\?php[\s\S]*?\?>|\s+(\w+)="([^"<]*(?:<\?php[\s\S]*?\?>[^<"]*)*)"/

这将匹配 PHP代码段一个完整的attribute="value"序列,其中值可能包含PHP代码。在每次比赛后,您可以通过检查捕获组的内容来找出您捕获的内容。如果它是您匹配的纯PHP段,则group[0]以外的所有段都将为空;否则,group[1]将包含属性名称,group[2]将包含值。

正则表达式假设<将作为<?php标记的开头显示在属性值中。当然,这不是一个语法上有效的假设,但它无论如何都可能是安全的。如果你需要我,我可以使正则表达式更精确,但它的可读性也会低得多。