Regex来匹配HTML标记内的属性,该标记可能包括php代码

Regex to match attributes inside an HTML tag which may include php code

本文关键字:代码 php 包括 HTML Regex 属性      更新时间:2023-09-26

通常我会将HTML属性与此regex 进行匹配

'w+=".*?"

但当HTML包含PHP代码时,它会变得有点挑剔。请考虑以下标签:

<option value="<?php echo $img; ?>"<?php echo ($hpb[$i]['image_filename']==$img?' selected="selected"':''); ?>>
    <?php echo $img; ?>
</option>

上述正则表达式将匹配在PHP逻辑内部确定的属性CCD_ 1。有没有一种方法可以匹配不在PHP标记中的属性,同时仍然匹配那些值可能包含PHP逻辑的属性?如果不能,我可以删除不属于属性值的PHP代码吗?

编辑:以下是我目前所拥有的:

 'w+="(((.(?!<'?php))*?)|((.((?=<'?php).*?(?='?>))*)*?))*"

这基本上意味着匹配一个以空格开头的字符串,然后贪婪地匹配字母数字字符,后跟等号,后跟双引号,然后匹配以下两个字符中的任何一个,同时捕获尽可能多的字符:

  1. 不包含字符串<?php的字符序列
  2. 包含模式<'?php.*?'?>的字符序列,或者换句话说,将属性的值部分与其所有PHP代码贪婪地匹配所有这些,直到遇到一个双引号结束
/<'?php['s'S]*?'?>|'s+('w+)="([^"<]*(?:<'?php['s'S]*?'?>[^<"]*)*)"/

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

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