如何修改正则以获取XML中带属性的标签并展示为表格?
XML标签(含属性)提取的正则修正方案
你的原有正则无法正确处理带属性的标签,核心问题是未明确区分标签名、属性和内容,也没通过反向引用确保闭合标签与起始标签匹配。以下是修正方案:
修正后的正则表达式
preg_match_all('|<([a-zA-Z0-9_-]+)([^>]*)>(.*?)</\1>|sU', $content, $matches, PREG_SET_ORDER);
正则各部分说明
<([a-zA-Z0-9_-]+):捕获合法XML标签名,支持字母、数字、下划线和短横线([^>]*):捕获标签内的所有属性(无属性时返回空字符串)>(.*?)</\1>:捕获标签内容,\1反向引用起始标签名,确保闭合标签匹配;s修饰符让.匹配换行符,U启用非贪婪模式避免跨标签匹配
示例代码(生成表格展示)
假设XML内容如下:
<book id="bk101"> <title>XML Developer's Guide</title> <author>Gambardella, Matthew</author> </book> <book id="bk102"> <title>Midnight Rain</title> <author>Ralls, Kim</author> </book>
处理并生成表格的代码:
// 输出表格 echo "<table border='1'> <tr> <th>标签名</th> <th>属性</th> <th>内容</th> </tr>"; foreach ($matches as $match) { // 转义特殊字符避免XSS $tagName = htmlspecialchars($match[1]); $attributes = htmlspecialchars(trim($match[2])); $content = htmlspecialchars(trim($match[3])); echo "<tr> <td>$tagName</td> <td>$attributes</td> <td>$content</td> </tr>"; } echo "</table>";
注意事项
- 正则仅适合结构简单的XML文档,若遇到嵌套层级深、含CDATA块、命名空间或自闭合标签的复杂XML,建议使用PHP原生的
DOMDocument或SimpleXML扩展,这类工具能更可靠地解析XML结构,避免正则的局限性。
内容的提问来源于stack exchange,提问作者oge richard
相关产品推荐
相关产品推荐

