有没有好用的PHP库可以将HTML/PHP文档转换成对象?

4
我看到很多可以解析HTML的PHP库。一个不错的例子是QueryPath,它模仿了Jquery API。
然而,我想分析phtml。因此,这个库不仅需要擅长分析DOM,还需要擅长分析php处理指令。例如Php文档对象模型或PDOM
像这样的文档:
<?php
require 'NameFinder.php';
$title = 'Wave Hello';
$name = getName();
?><html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<h1>Hello <?php echo $name ?></h1>
<p>Blah Blah Blah</p>
</body>

我希望能够使用这种php库来读取以下内容:
  • 通过xpath或css选择器找到的DOM节点的内部html。

也可能提供以下内容:

  • 脚本中调用的php函数/方法列表
  • php变量的值
  • 该页面所需的页面
  • 第5行之前使用的php变量列表
  • body元素的第一个段落之前使用的php变量列表

我可以花一些时间拼凑一些东西,从phpdocumentorZend Framework Reflection等地方借用代码,使用内置的DOM Api、内省和字符串操作等。但是,如果有一种*phtmlQuery"库可以做这些事情,那将会很方便。


1
“分析 PHP 处理指令” 是什么意思?实际上是解释/执行 PHP 代码吗? - nickb
我认为这样的东西不存在,而且我认为也不应该存在。你可以将PHP和HTML代码分开,并分别进行分析(使用解析器分析HTML,使用Reflection或令牌化工具分析PHP)。你的实际用例是什么? - Pekka
PHP核心中包含了一个XML解析器,可以完成这个任务,但是你只能在有效的XHTML页面上使用它,而不能在普通的HTML或破碎的XHTML上使用。你需要设置解析器来处理处理指令,这可能会变得非常复杂。 - dqhendricks
但这会是什么无聊的东西呢?如果你没有实际运行这个东西,你将无法获得任何变量值(在这种情况下,您最好使用调试器)。你能得到的可能只是一组使用的变量列表......前提是旧代码没有使用变量变量或 eval() - Pekka
1
@Pekka- 我有点儿调皮,因为我现在有点儿调皮的心情。我理解你的意思。如果我试图分析“糟糕”的任意代码,那将是一场噩梦。然而,这是非常良好结构的phtml,我知道从中可以得到什么限制。我知道肯定有一些任务可以自动化,以节省我的时间。“重写重构”的辩论总是会激烈进行。 - JW.
显示剩余8条评论
3个回答

3

要从您的文件中获取处理指令(和其他节点),您可以使用DOMXPath

$dom = new DOMDocument;
$dom->loadHTMLFile('/path/to/your/file/or/url');
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//processing-instruction()') as $pi) {
    echo $dom->saveHTML($pi), PHP_EOL;
}

这将输出:
<?php require 'NameFinder.php';
$title = 'Wave Hello';
$name = getName();
?>
<?php echo $title ?>
<?php echo $name ?>

这段代码可以处理破损的HTML。你可以在以下链接中找到附加库: 一旦你得到了处理指令,你可以通过本地Tokenizer运行它们,或尝试以下方法: 这些不会神奇地为你提供你所需要的信息,所以你可能需要自己编写一些额外的代码。

谢谢。那些反射库是非常好的链接。正是我需要的那种东西。我刚开始学习QueryPath。所以,当我准备好了,我会看看是否可以将PHP-Token-Reflection作为QueryPath的扩展来使用。如果没有人先做的话。 - JW.

0
你可以使用 PHP 的 token_get_all 函数对 PHP 代码进行分词,然后遍历结果并检查函数调用和 PHP 值。

E.g.:

<?php

$src = <<<EOD
<?php
require 'NameFinder.php';
$title = 'Wave Hello';
$name = getName();
?><html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<h1>Hello <?php echo $name ?></h1>
<p>Blah Blah Blah</p>
</body>
EOD;

$tokens = token_get_all($src);

var_dump($tokens);

你仍然需要编写一些代码来遍历所有的标记,查看它们是什么,然后根据标记类型(函数名称、字面字符串、变量赋值等)获取值,但这对于解析 PHP 来说已经完成了很多工作。


谢谢你的建议。是的,我担心这需要很多工作。我梦想有一个好用的工具已经存在,让一切变得轻松愉快。:o) - JW.
我知道一个这样的工具 - PHP解释器。 - Pekka

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接