如何识别文本是否为HTML?(用PHP)

如何识别文本是否为HTML?(用PHP),php,html,text,htmlpurifier,Php,Html,Text,Htmlpurifier,我想从数据库中读取文本条目,其中一些实际上是HTML条目,另一些只是纯文本,可能包含HTML标记,应该显示为文本 然后,应通过首先调用PHP的htmlspecialchars函数,然后通过HTMLPurifier运行结果,将纯文本转换为HTML 或者换句话说,我正在寻找一些关于如何实现isHTML功能的提示: $text = getTextFromDatabase(); if (!isHTML($text)) { $text = htmlspecialchars($text); } $p

我想从数据库中读取文本条目,其中一些实际上是HTML条目,另一些只是纯文本,可能包含HTML标记,应该显示为文本

然后,应通过首先调用PHP的htmlspecialchars函数,然后通过HTMLPurifier运行结果,将纯文本转换为HTML

或者换句话说,我正在寻找一些关于如何实现isHTML功能的提示:

$text = getTextFromDatabase();
if (!isHTML($text)) {
    $text = htmlspecialchars($text);
}
$purifier = new HTMLPurifier();
$clean_html = $purifier->purify($text);
例如,以下文本将通过htmlspecialchars运行:

看起来应该已经有了一个isHTML函数,但我就是找不到它,我不想重新发明轮子:-。也许甚至可以通过某种HTMLPurifier设置来实现这一点

请注意,如果HTML代码有缺陷,则应由HTMLPurifier处理,并且代码不应通过htmlspecialchars运行:例如,当HTML代码中确实应该有一个结束标记时,有一个开始标记

感谢您的帮助,谢谢:-,
Robert。

您只能检查字符串中特定于html的字符

function is_html($string)
{
  return preg_match("/<[^<]+>/",$string,$m) != 0;
}
考虑一下这个逻辑: 如果htmlentities检测到有效的html文本,则htmlentities的输入文本和输出文本是不同的。因此:

function isHTML($text){
   $processed = htmlentities($text);
   if($processed == $text) return false;
   return true; 
}

我希望这对您有用

我在想,我们是否可以将striptagged版本的string与原始版本进行比较。如果它们不同,那么就有一些东西需要剥去。这家伙提出了同样的建议:

如果唯一的目的是检测字符串是否包含任何html标记。无论标记是否有效,您都可以尝试以下操作:

function fcl_utilities_is_html($string) {
  // Check if string contains any html tags.
  return preg_match('/<\s?[^\>]*\/?\s?>/i', $string);
}

您可以在此处验证此功能

您可以尝试使用此功能

function isHTML($string){
    return ($string != strip_tags($string));
}

这两个都是机器的HTML代码片段,我很难按照您的逻辑确定哪些应该编码&哪些不应该,除非你想写一个可以逻辑解释文本的人工智能,然后知道它们之间的区别…实际的HTML条目和可能包含HTML标记的纯文本之间有什么区别?我喜欢这个想法,但必须稍微扩展一下。使用/^\s*/匹配行首的开始标记,使用/\s*$/匹配行尾的结束标记,这会导致忘记键入/字符的错误。然后,我可以计算一个带标记块的开始和结束标记块中包含了多少行,不允许出现空行/空行。将标记块中的行数除以没有空行的行总数,就可以估计出包含HTML文本的可能性:-如果html标记无效,此解决方案将返回正误。您可以在这里检查,我认为这应该是公认的答案,因为它还可以区分HTML和XML。此函数无法判断字符串是否为HTML。例如,参见isHTML'A=>B意味着如果A为真,那么B也为真;如果A为false,则不会对B进行任何说明。'返回不正确的true。它所做的唯一一件事就是判断字符串是否包含可以转换为HTML实体的字符。
function fcl_utilities_is_html($string) {
  // Check if string contains any html tags.
  return preg_match('/<\s?[^\>]*\/?\s?>/i', $string);
}
function isHTML($string){
    return ($string != strip_tags($string));
}