PHP用strip_tags HTML验证和支架检查?

时间:2019-01-31 11:21:06

标签: php strip-tags html-validation

我现在使用strip_tags($content, '<a>')标签来清除除<a>标签之外的html标签。

示例1:Example "lorem ipsum dolor <sit amet....."剪切掉“ <”之后的所有内容

示例2:如果内容以"<test lorem ipsum"开头,我只会得到空字符串。

我试图用正则表达式检查它,但是结果是一样的。

preg_replace('/<[^>]*>/', '', $content)会返回相同的结果进行验证。

我需要以某种方式来清除html和使用的保持正确的“<”的内容内部支架上。

1 个答案:

答案 0 :(得分:-1)

如果您想清除除普通<a></a>之外的所有标签,可以过滤它们,替换它们,然后清除HTML并将它们替换回来,如下所示:

<?php
    $text = "<a> ahahahasjusjhcbzdeu <div>JEY ssjisuj</div>jn<p> here somehing else </p></a>";

    $EndText = str_replace("<a>", "&ATL", $text);
    $EndText = str_replace("</a>", "&ATR", $EndText);

    $EndText = strip_tags($EndText);

    $EndText = str_replace("&ATL", "<a>", $EndText);
    $EndText = str_replace("&ATR", "</a>", $EndText);

    echo htmlspecialchars($EndText);
?>

但是,如果您想获取类似<a href="mywebsite.com"> here </a>的内容,则该链接也会被删除。
因此,您需要过滤掉<a>之间的文本(可以通过explodesub_strstr_replace进行过滤),然后执行与在上面的解决方案中,然后再次粘贴。
可以做到这一点的代码是:

<?php
    $text = "<a>Here something</a><div>Again<a href='website.com'>That's a better link</a> Here</div>";

    $Texts = explode("<a", $text);
    $Begin = strip_tags(array_shift($Texts));
    $Middles = [];
    foreach ($Texts as &$value) {
        $Middle = explode(">", $value)[0];
        array_push($Middles, $Middle);

        $Position = strpos($value, ">");
        $value = substr($value, $Position+1);
        $value = str_replace("</a>", "&htlENDA&", $value);
        $value = strip_tags($value);

    }

    $EndText = $Begin;

    for ($i = 0; $i < count($Texts); $i++) {
        $EndText = $EndText."<a".$Middles[$i].">".$Texts[$i];
    }

    $EndText = str_replace("&htlENDA&", "</a>", $EndText);

    echo "<br><br>Ende: ".htmlspecialchars($EndText);

?>

这将解决您的问题,因为它会删除除<a ... ></a>之外的所有html标记