如何从字符串中删除除反引号中包含的标记之外的所有HTML标记?

时间:2014-08-20 23:08:26

标签: php

我使用PHP的strip_tags()函数从字符串中删除标记。例如:

$text = strip_tags( $text );

我的目标是去除所有标签,除非标签碰巧包含在反引号中。如果标签包含在反引号内,我不想剥离它们。

我的第一个想法是尝试使用strip_tags()的第二个参数。这将让我指定不被删除的允许标签。例如,strip_tags( $text, '<strong>')。但是,这并没有完全符合我的要求。

如何从正好包含在反引号中的字符串除了标记中删除所有HTML标记?

参考:http://php.net/manual/en/function.strip-tags.php

2 个答案:

答案 0 :(得分:2)

用一个答案来支持我的评论,例如:

function strip($input)
{
    preg_match_all('/`([^`]+)`/', $input, $retain);

    for($i = 0; $i < count($retain[0]); $i++)
    {
        // Replace HTML wrapped in backticks with match index.
        $input = str_replace($retain[0][$i], "{{$i}}", $input);
    }

    // Strip tags.
    $input = strip_tags($input);

    for($i = 0; $i < count($retain[0]); $i++)
    {
        // Replace previous replacements with relevant data.
        $replace = $retain[1][$i];

        // Do some stuff with $replace here - maybe check that it's a tag
        // you're comfortable with else use htmlspecialchars(), etc.
        // ...

        $input = str_replace("{{$i}}", $replace, $input);
    }

    return $input;
}

通过测试:

echo strip("Hello <strong>there</strong>, what's `<em>`up`</em>`?");
// Output: Hello there, what's <em>up</em>?

答案 1 :(得分:1)

如果你的转义序列被固定为`,你可以做一些比混淆更简单的事情(Marty在他的评论中提出,如果我是完全诚实的话,这是我最喜欢的技巧之一)。即使你使用混淆或preg_replace,你仍然需要考虑转义的滴答。

相反,您可以执行以下操作:

$strippeddown = array();
$breakdown = explode('`', $text);
$j = 1;

foreach ($breakdown AS $i => $gather)
{
    if ($j > 1)
    {
        $j--;
        unset($breakdown["$i"]);
        continue;
    }

    $j = 1;
    while (strrpos($gather, '\\') === 0 AND isset($breakdown[$i + $j]))
    {
        $gather = $breakdown[$i + $j];
        $breakdown["$i"] .= '`' . $gather;
        $j++;
    }
}

$breakdown = array_values($breakdown);

foreach ($breakdown AS $i => $gather)
{
   if (!$i OR !($i % 2))
   {
      $strippeddown[] = strip_tags($gather);
   }
   else
   {
      $strippeddown[] = $gather;
   }
}

$text = implode('`', $strippeddown);