在PHP中,哪个函数可以验证字符串是否为HTML格式?
我的目标是从用户输入中获取数据,并检查其是否为HTML格式,而不仅仅是字符串。
以下是非HTML格式的示例:
sdkjshdk<div>jd</h3>ivdfadfsdf or sdkjshdkivdfadfsdf
HTML字符串的示例:
<div>sdfsdfsdf<label>dghdhdgh</label> fdsgfgdfgfd</div>
谢谢
在PHP中,哪个函数可以验证字符串是否为HTML格式?
我的目标是从用户输入中获取数据,并检查其是否为HTML格式,而不仅仅是字符串。
以下是非HTML格式的示例:
sdkjshdk<div>jd</h3>ivdfadfsdf or sdkjshdkivdfadfsdf
HTML字符串的示例:
<div>sdfsdfsdf<label>dghdhdgh</label> fdsgfgdfgfd</div>
谢谢
function check($string) {
$start =strpos($string, '<');
$end =strrpos($string, '>',$start);
$len=strlen($string);
if ($end !== false) {
$string = substr($string, $start);
} else {
$string = substr($string, $start, $len-$start);
}
libxml_use_internal_errors(true);
libxml_clear_errors();
$xml = simplexml_load_string($string);
return count(libxml_get_errors())==0;
}
注意:HTML允许存在以下类似未平衡的字符串。它不是XML有效的块,但是它是合法的HTML块。
<ul><li>Hi<li> I'm another li</li></ul>
免责声明:我已经修改了代码(未经测试),以便检测字符串中的格式良好的HTML。
最后一点建议: 也许你应该使用strip_tags来控制用户输入(正如我在你的评论中看到的)。
<br><p>FooBar
是有效的HTML(即使没有关闭 p
标签!),但是这种方法会报告错误。 - Stephan Vierkant如果没有单个根节点,simplexml_load_string
将无法正常运行。
因此,如果您尝试使用以下HTML代码:
<p>A</p><p>B</p>
它将是无效的。
这是我的函数:
function check($string){
$start = strpos($string, '<');
$end = strrpos($string, '>', $start);
if ($end !== false) {
$string = substr($string, $start);
} else {
$string = substr($string, $start, strlen($string) - $start);
}
// xml requires one root node
$string = "<div>$string</div>";
libxml_use_internal_errors(true);
libxml_clear_errors();
simplexml_load_string($string);
return count(libxml_get_errors()) == 0;
}
您是指HTML还是XHTML?
HTML标准和解释非常宽松,因此您的第一个代码片段可能会起作用。它不会很美观,但您可能会得到一些结果。
XHTML要求相当严格,至少需要您的代码片段格式正确(所有开放的标签都被关闭;标签可以嵌套但不能重叠),如果存在未识别的元素或属性,则可能会抛出警告。
类似Tidy这样的工具 - http://php.net/manual/en/book.tidy.php - 可能是一个好的开始。加载您的代码片段后,您可以使用tidy_error_count或tidy_get_error_buffer来查看是否符合您的需求。
您应该使用:
$html="<html><body><p>This is array.</p><br></body></html>";
libxml_use_internal_errors(true);
$dom = New DOMDocument();
$dom->loadHTML($html);
if (empty(libxml_get_errors())) {
echo "This is a good HTML";
}else {
echo "This not html";
}
$html = $html.'<br>';
会失败,因为逻辑上这不是正确的(x)HTML。然而,当使用$dom -> loadXML($html);
和$html = '<br /><p>k</p>';
时,此函数也会失败(请注意loadXML
)。 - Stackoverflow