现在我需要一个访问者来从 PHP 文件中提取 HTML 标记。起初,我以为我会提取 InLineHTML 类型的节点的值。像这样
if ($node instanceof Node\Stmt\InlineHTML)
{
self::$result[] = json_encode(utf8_encode($node->value),JSON_UNESCAPED_SLASHES);
}
但是我发现只有 PHP 标记之外的 HTML 标记被认为是 InLineHTML 节点。像这样
<?php
echo "aaa";
?>
<input name='test' value=''>
但后来我发现我可以使用 echo 来输出 PHP 代码中的 HTML 标签,并且它们会被视为 String_Node。
<?php
echo "<input name='test' value='aaa'>";
/*
1: Stmt_Echo(
exprs: array(
0: Scalar_String(
value: <input name='test' value='aaa'>
)
)
)
*/
或者
<?php
return '<tr class=tr1><td class=td1 width='.$l.'% align=right>';
/*
0: Stmt_Return(
expr: Expr_BinaryOp_Concat(
left: Expr_BinaryOp_Concat(
left: Scalar_String(
value: <tr class=tr1><td class=td1 width=
)
right: Expr_Variable(
name: l
)
)
right: Scalar_String(
value: % align=right>
)
)
)
*/
这种情况下,使用判断InLineHTML进行判断是不准确的。对于String_中的完整标签,我可以使用正则表达式来匹配。但是如果标签是 Concat,比如'<input'.'>'
,那么这就变得困难了。
如何使用单个访客进行 HTML 标记提取