我试图提出一个正则表达式,它将被应用于潜在的数百个文件,作为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 />
不存在时才能执行替换。我不太确定如何用直接正则表达式做到这一点。
任何想法都会受到最高的赞赏。谢谢。
答案 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=edge"\s*/>)
将使匹配失败。 (.*?<title>.*?</title>)
使用和捕获文本,包括第一个title
标记。然后(.*)
匹配文档的其余部分。
请参阅regex demo