RegEx提取所有HTML标记属性,包括嵌入式JavaScript

在解析HTML标记属性时,我在这里找到了这个有用的正则表达式代码:

(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?

它的效果很好,但是却缺少了我需要的一个关键要素.一些属性是事件触发器,其中包含内联Javascript代码,如下所示:

onclick="doSomething(this,'foo','bar');return false;"

要么:

onclick='doSomething(this,"foo","bar");return false;'

我无法弄清楚如何将原始表达式嵌套在包含属性值的一组引号中,从而不计算JS中的引号(单或双).

我应该补充一点,这不是用于解析整个HTML文档.在我更新的旧版“选择菜单数组”函数中,它用作参数.参数之一是可以将额外的HTML属性附加到form元素的标记.

我做了一个改进的功能,不赞成使用旧的功能…但是如果代码中的某个地方调用了旧功能,我需要它将它们解析为新的数组格式.例:

// Old Function
function create_form_element($array,$type,$selected="",$append_att="") { ... }
// Old Call
create_form_element($array,SELECT,$selected_value,"onchange=\"something(this,'444');\"");

新版本采用attr =>值对以创建额外的标签.

create_select($array,array('style' => 'width:250px;','onchange' => "doSomething('foo','bar')"));

这只是一个向后兼容性问题,其中对OLD函数的所有调用都路由到新函数,但是旧函数中的$append_att参数需要被设置为新函数的数组,因此我需要使用regex进行解析小型HTML片段.如果有更好,更轻便的方法来实现此目的,我欢迎您提出建议.

最佳答案
正则表达式的问题在于它试图同时处理单引号和双引号.它不支持包含其他引号的属性值.此正则表达式将更好地工作:

(\w+)=("[^<>"]*"|'[^<>']*'|\w+)

相关文章

HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环...
HTML(Hypertext Markup Language,超文本标记语言)是一种用...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以...