PHP正则表达式,当rel =“canonical”时跳过<link />标签

时间:2017-03-28 09:53:45

标签: php regex

我在WordPress中运行一个PHP脚本,使用以下正则表达式从所有链接中删除http:https:协议:

$links = preg_replace( '/<input\b[^<]*\bvalue=[\"\']https?:\/\/(*SKIP)(*F)|https?:\/\//', '//', $links );

对于第一部分:<input\b[^<]*\bvalue=[\"\']https?:\/\/(*SKIP)(*F),这会跳过任何<input> / http:值的https:代码,例如:

<input type="url" value="http://example.com">

此外,我希望它跳过任何具有<link>属性的rel="canonical"代码:

<link rel="canonical" href="http://example.com/remove-http/" />

使用regex tester,我一直在尝试更新逻辑。这是我到目前为止所提出的:

<(input|link)\b[^<]*\(value|rel)=[\"\'](https?:\/\/|canonical)(*SKIP)(*F)|https?:\/\/

但这对我没用。

2 个答案:

答案 0 :(得分:1)

(*SKIP)(*F)动词用于丢弃到目前为止匹配的文本,并继续从文本与这些动词之前的模式匹配之后的正则表达式索引所在的位置搜索下一个匹配。

因此,要匹配word1 word2,请删除它们并继续寻找word3,您需要使用

'~(?:word1|word2)(*SKIP)(*F)|word3~'

(?:...)非捕获组将对必须删除的备选项进行分组。

在您的情况下,应该匹配整个<link...>,而不仅仅是属性。因此,在上述正则表达式中,您需要link\b[^>]*?\brel=[\'\"]canonical[\'\"][^>]*>而不是word2

但是,您应该考虑使用与您的环境兼容的HTML解析器(我看到您注意到DOMDocument在那里发生故障)。

答案 1 :(得分:0)

您应该考虑使用内置的PHP DOM类。

http://php.net/manual/en/book.dom.php

HTML是一种非常丰富的语言,正则表达式不够强大,无法有效地解析它。请不要使用正则表达式解析HTML。

使用正则表达式解析HTML将以这种方式使SO用户疯狂:https://stackoverflow.com/a/1732454/5909136