PHP正则表达式,跳过<;链接>;rel=”时的标记;规范的;

PHP正则表达式,跳过<;链接>;rel=”时的标记;规范的;,php,regex,Php,Regex,我在WordPress中运行一个PHP脚本,使用以下正则表达式从所有链接中删除http:和https:协议: $links = preg_replace( '/<input\b[^<]*\bvalue=[\"\']https?:\/\/(*SKIP)(*F)|https?:\/\//', '//', $links ); 此外,我希望它跳过任何具有rel=“canonical”属性的标记: <link rel="canonical" href="http://example.c

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

$links = preg_replace( '/<input\b[^<]*\bvalue=[\"\']https?:\/\/(*SKIP)(*F)|https?:\/\//', '//', $links );
此外,我希望它跳过任何具有
rel=“canonical”
属性的
标记:

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

我一直在尝试使用一种新的方法来更新逻辑。这就是我到目前为止的想法:

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

<代码> 您应该考虑使用内置的PHP DOM类。

HTML是一种非常丰富的语言,正则表达式的功能不足以有效地解析它。请不要使用正则表达式解析HTML

使用正则表达式解析HTML会让用户发疯:

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

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

'~(?:word1|word2)(*SKIP)(*F)|word3~'
(?:…)
非捕获组将对必须删除的备选方案进行分组

在您的情况下,应该匹配整个
,而不仅仅是匹配属性。因此,您需要类似于
link\b[^>]*?\brel=[\'\“]规范[\'\'\“][^>]*>
的内容,而不是上述正则表达式中的
word2


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

不是答案,但是你真的应该停止使用协议相关的URL,因为它们对安全性和性能有害:和。类似的。我是在其他人的帮助下这样做的,和。但它引发了更多的问题,尤其是在WordPress的管理面板上。在我恢复到regex之前,非常欢迎您帮助改进该版本。您说得对,我切换到了
DOMDocument
,但这导致了问题。
'~(?:word1|word2)(*SKIP)(*F)|word3~'