我使用PHP的strip_tags()
函数从字符串中删除标记。例如:
$text = strip_tags( $text );
我的目标是去除所有标签,除非标签碰巧包含在反引号中。如果标签包含在反引号内,我不想剥离它们。
我的第一个想法是尝试使用strip_tags()
的第二个参数。这将让我指定不被删除的允许标签。例如,strip_tags( $text, '<strong>')
。但是,这并没有完全符合我的要求。
如何从正好包含在反引号中的字符串除了标记中删除所有HTML标记?
答案 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);