用于添加元标记的正则表达式(如果不存在)(记事本++)

时间:2017-06-02 19:36:34

标签: html regex notepad++ meta-tags

我试图提出一个正则表达式,它将被应用于潜在的数百个文件,作为notepad ++中的find..replace。它会变成if..else。

这是我想要做的,但作为正则表达式:

如果标题标记存在且页面上不存在<meta http-equiv="X-UA-Compatible" content="IE=edge" />,并且存在iframe标记,则在标题标记后面插入<meta http-equiv="X-UA-Compatible" content="IE=edge" />

示例文字:

<title>Some Title</title>
<meta name="description" content="Mydescription." />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />

 ...

<iframe src="iframeresource"></iframe>

我到目前为止的正则表达式:

(<title>.*<\s*\/title>).*?(?!<meta http-equiv="X-UA-Compatible" content="IE=edge"\s*\/>.*?<iframe)

它使用负向前瞻。我需要类似条件否定前瞻的东西,但是当且仅当<meta http-equiv="X-UA-Compatible" content="IE=edge />不存在时才能执行替换。我不太确定如何用直接正则表达式做到这一点。

任何想法都会受到最高的赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

HTML解析最好使用专用的DOM解析器完成。正则表达式只能用于修复结构良好,一致的HTML代码。

如果是这种情况,请使用

(?si)\A(?!.*?<meta\s+http-equiv="X-UA-Compatible"\s+content="IE=edge"\s*/>)(.*?<title>.*?</title>)(.*)

并替换为$1\n<meta http-equiv="X-UA-Compatible" content="IE=edge" />$2\n

(?si)使.能够匹配换行符并使模式不区分大小写。 \A匹配文件的开头。如果元标记模式匹配,(?!.*?<meta\s+http-equiv="X-UA-Compatible"\s+content=‌​"IE=e‌​dge"\s*/>)将使匹配失败。 (.*?<‌​title>.*?</title>)使用和捕获文本,包括第一个title标记。然后(.*)匹配文档的其余部分。

请参阅regex demo