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

时间:2012-03-22 14:51:23

标签: php html regex forms

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

我用它来替换我的隐藏字段为空白:

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

它只会带回“&lt;&gt;&lt;&gt;&lt;&gt;” (2个隐藏字段和结束表单标记)。我试着用字符串替换&lt;&gt;这似乎不起作用

我错过了什么吗?

5 个答案:

答案 0 :(得分:2)

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

在你的情况下<是引用字符,它会使结尾引用>(即"<regex>"),从而使其在preg_*中有效而不会给你任何错误。

例如:

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

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

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

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

虽然你想要:

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

答案 1 :(得分:1)

你需要转义斜杠..并为修饰符添加斜线以使其工作http://php.net/manual/en/reference.pcre.pattern.modifiers.php

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

答案 2 :(得分:0)

如果我没记错的话,你可以把模式放在%'之间,以避免所有逃脱,这使得实际上不可读,例如

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

答案 3 :(得分:0)

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

我只是检查了那些实体,并将字符串替换为正确的符号,然后就可以了。

答案 4 :(得分:0)

试试这个

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