用于查找HTML标记的正则表达式会在PHP中留下空标记


Regular Expression for finding HTML tags leaves empty tags behind in PHP

我试图通过正则表达式删除所有隐藏的标记(和结束标记),它似乎有效,但有一个问题。它为所有找到的元素留下"<>"。

我用这个来用空白替换我的隐藏字段:

$saveContent = preg_replace('<input type="hidden" .*? />', "", $saveContent);
$saveContent = preg_replace('</form>', "", $saveContent);

它只带回"<><>>"(2个隐藏字段和结束表单标记)。我尝试字符串替换<>这似乎也不起作用

我是不是错过了什么?

问题(除了试图将HTML与regex匹配之外)是,您没有正确地在字符串中引用表达式,这通常在类似"/regex/"的PHP中完成,但可以使用任何字符来代替斜杠,例如"~regex~"

在您的案例中,<是引号字符,它使结束引号成为>(即"<regex>"),从而使其在preg_*中有效,并且不会给您任何错误。

例如:

preg_replace('</form>', "", $str)

与相同

preg_replace('~/form~', "", $str)

preg_replace('/'/form/', "", $str)

所有这些都用一个空字符串替换/form

当你想要:

preg_replace('~</form>~', "", $str)

您需要转义斜杠。。并添加斜线以便修改器工作http://php.net/manual/en/reference.pcre.pattern.modifiers.php

$saveContent = preg_replace('/<input type="hidden" .*? '/>/i', "", $saveContent);    
$saveContent = preg_replace('/<'/form>/i', "", $saveContent);

如果我没记错,你可以把模式放在%之间,以避免所有使实际不可读的转义,例如

if (preg_match('%</form>%', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

由于某种原因(我不知道);和>符号被转换为实体,但仅限于少数几个。

我只是检查了这些实体,并用字符串将它们替换为正确的符号,结果就成功了。

试试这个

$content = '<input type="hidden" name="abc" /> abc <input type="hidden" name="abc" />';
preg_replace('#<input type="hidden"[^>]+>#', '', $content);