正则表达式。找到带属性的标签

时间:2010-06-24 11:47:27

标签: php regex preg-replace

我需要一个reg exp(用于执行preg_replace)来查找具有<font>属性的所有style="..."标记...

问题是我只需要将<font>与样式属性和值

匹配
"height: 0;overflow: hidden;width: 0; position: absolute;"...

另一个问题,style属性可能处于不同的位置;

离。

<font  color="white"  style="height: 0;overflow: hidden;width: 0; position: absolute; font-family:courier; font-size:10px" >

<font  style="height: 0;overflow: hidden;width: 0; position: absolute; font-family:tahoma; font-size:14px" color="red"   >

编辑:解决它:

#</?font [^>]*\bheight: 0;overflow: hidden;width: 0; position: absolute;[^>]* >(.+</font[^>]*>|)#is

(找到具有该样式的标签及其包含的所有内容)

preg_replace()中的reg exp似乎有效!!

2 个答案:

答案 0 :(得分:3)

您可以使用以下XPath表达式获取所有<font>标记(假设您的HTML文档格式正确):

//font[@style='height: 0;overflow: hidden;width: 0; position: absolute;']

在PHP中,有许多方法可以在文档上运行XPath表达式,例如this one

如果您的HTML格式不正确,您可以使用HTML解析器,例如this one that I just found。它支持类似JQuery的选择器,因此您可以使用以下表达式找到您的元素:

font[style*='height: 0;overflow: hidden;width: 0; position: absolute;']

我必须警告你不要使用Jens的解决方案,因为试图用正则表达式解析HTML是一个进入纯粹恶意疯狂的黑暗深渊的旅程。 HTML是一种嵌套的递归结构。就其本质而言,正则表达式无法处理这种递归。虽然您可能能够创建一个看起来很有效的表达式,但肯定会有一些有效的案例或者与之不相符的案例。我恳请您使用实际的基于DOM的解析器。

答案 1 :(得分:1)

如果您确定您的HTML足够好,可以被Regex访问(即没有评论,没有格式错误,样式css不包含注释,......)并且只想匹配开始标记(嵌套是一个没有正则表达式,你可以尝试

<font [^>]*\bstyle="([^"]*)"[^>]*>

此正则表达式将每个font-tag与style属性匹配,并在其唯一的捕获组中包含此属性的值。

编辑:也许我误解了这个问题。如果您需要将style属性设置为您指定的值,请使用

<font [^>]*\bstyle="height: 0;overflow: hidden;width: 0; position: absolute;"[^>]*>
相关问题