PHP正则匹配XML属性(name/author)值内的转义字符问题
解决XML属性值内特殊字符转义问题
你的核心需求是对XML中name和author属性值(单/双引号包裹)内的特殊字符进行转义,比如<转<、'转'等。原正则仅处理双引号场景且匹配逻辑有误,无法覆盖所有情况,以下是可行的解决方案:
正确的正则匹配方案
使用支持单/双引号属性的正则,同时通过捕获组区分引号类型,确保准确匹配属性值:
/(name|author)=(["'])(.*?)\2/g
正则说明:
(name|author):匹配目标属性名=(["']):匹配属性赋值符号和包裹值的单/双引号(捕获引号类型到组2)(.*?):非贪婪匹配属性值内容,避免跨属性匹配\2:引用组2的引号,确保匹配到和开头一致的闭合引号/g:全局匹配所有符合条件的属性
转义逻辑与代码示例
以JavaScript为例,编写转义函数处理属性值内的特殊字符,再配合正则完成全局替换:
const rawXml = `<info name="Name containing ' apostrophe" author="Lower than < Character" ></info><info name='Name containing ' apostrophe' author='Lower than < Character' ></info>`; // 针对属性值的转义函数 function escapeAttributeValue(value, quoteType) { // 优先转义&,避免其他转义字符被二次处理 let result = value.replace(/&/g, '&'); // 转义XML特殊字符< result = result.replace(/</g, '<'); // 根据包裹引号类型处理对应引号转义 if (quoteType === '"') { // 双引号包裹的属性值,转义单引号 result = result.replace(/'/g, '''); } else { // 单引号包裹的属性值,转义双引号和单引号 result = result.replace(/"/g, '"'); result = result.replace(/'/g, '''); } return result; } // 执行全局替换 const processedXml = rawXml.replace(/(name|author)=(["'])(.*?)\2/g, (match, attrName, quote, value) => { const escapedValue = escapeAttributeValue(value, quote); return `${attrName}=${quote}${escapedValue}${quote}`; }); console.log(processedXml);
原正则问题分析
你之前使用的正则(name|author)="(\\[\"]|[^\"])*"[<|']存在以下问题:
- 仅支持双引号包裹的属性,未处理单引号场景
- 匹配逻辑
(\\[\"]|[^\"])*写法错误,无法正确识别转义或非引号字符 - 末尾的
[<|']限制了匹配的结尾位置,导致无法匹配标签内正常的属性结构
内容的提问来源于stack exchange,提问作者Oversitoo
相关产品推荐
相关产品推荐

