我想爲少數項目構建一些規模較小但高度自定義的文檔網站。 PhpDocumentor非常棒,但它非常重。我考慮過爲此調整模板,但花費了幾分鐘的時間纔看到它,我認爲這將是太多的工作。是否有任何PHP DocBlock解析器工具可用?
理想情況下,我希望看到一些我可以傳遞一堆文件並讓它返回所有文件,類,屬性和方法以及他們的元數據的東西,這樣我就可以構建出一些簡單的基於數據的模板。
是否有任何DocBlock解析器項目可以幫助我完成這項任務,還是我堅持重新發明那個輪子?
我想爲少數項目構建一些規模較小但高度自定義的文檔網站。 PhpDocumentor非常棒,但它非常重。我考慮過爲此調整模板,但花費了幾分鐘的時間纔看到它,我認爲這將是太多的工作。是否有任何PHP DocBlock解析器工具可用?
理想情況下,我希望看到一些我可以傳遞一堆文件並讓它返回所有文件,類,屬性和方法以及他們的元數據的東西,這樣我就可以構建出一些簡單的基於數據的模板。
是否有任何DocBlock解析器項目可以幫助我完成這項任務,還是我堅持重新發明那個輪子?
您可以用Reflection API:
/**
* This is an Example class
*/
class Example
{
/**
* This is an example function
*/
public function fn()
{
// void
}
}
$reflector = new ReflectionClass('Example');
// to get the Class DocBlock
echo $reflector->getDocComment()
// to get the Method DocBlock
$reflector->getMethod('fn')->getDocComment();
做到這一點很容易看到自己本教程:http://www.phpriot.com/articles/reflection-api
還有一個PEAR package可以解析文檔塊。
您似乎想要一個可以導出已解析內容的特定細節的PHP解析器。
我們的Semantic Designs PHP Front End提供了完整的PHP 4/5解析器(截至2016年包括PHP 7)。它解析PHP源代碼,構建抽象語法樹,用精確的位置信息標記每個節點,並使其可供進一步使用。它可以做的一件事是將任何子樹打印回原始文本。
就你而言,你需要掃描樹,找到類/方法/屬性(作爲樹節點)並打印它們的源文本以及位置信息。我認爲這將提供你想要的。
Ira Baxter,這就像我遇到的商業產品的第五個廣告同時試圖解決與PHP DocBlocks相關的問題。 在這些廣告中,您沒有明確說明文字上與廣告產品供應商的關係。 – 2015-09-02 11:07:19
你稱他們爲「廣告」,以表示對商業問題解決方案的反對。這爲OP建議的問題提供了一個解決方案,這使得這是一個合理的答案。有人反對我的一些反應沒有清楚地表明我的聯繫,這些反對在SO的生命早期偶爾是真實的,儘管我的生物非常明確地表明我*是供應商,而不僅僅是關聯。這是非常早期的迴應之一。 ...... – 2015-09-02 12:41:45
......表明歸屬問題早已解決;如果你堅持,你可以去查閱Meta中的討論。決議是允許使用「我們」這個詞來表示這種聯繫。這個特定的答案是在有政策之前寫的,所以沒有遵循政策。我現在正在編輯遵循策略的答案。如果您知道其他人沒有,請通過電子郵件向我發送一份清單(或在這裏留言),我會相應地修改它們。自決議以來,我一直嚴格遵循政策。 – 2015-09-02 12:44:03
只是爲了更新答案。您可能還想查看phpDocumentor2項目。我認爲這是PHP DocBlock解析器可以很容易地作爲獨立解決方案提取。
萬一有人需要一個正則表達式(xdazzsuggested試試這個和student310評論它的工作原理爲她/他的需求)
if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){
$result = array_combine($matches[1], $matches[2]);
}
例(Demo):
<?php
$str ='
/**
* @param integer $int An integer
* @return boolean
*/
';
if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){
$result = array_combine($matches[1], $matches[2]);
}
var_dump($result);
由於furgas pointed out,我一直在使用phpDocumentor多年作爲一個獨立的項目,它工作正常。
<?php
$class = new ReflectionClass('MyClass');
$phpdoc = new \phpDocumentor\Reflection\DocBlock($class);
var_dump($phpdoc->getShortDescription());
var_dump($phpdoc->getLongDescription()->getContents());
var_dump($phpdoc->getTags());
var_dump($phpdoc->hasTag('author'));
var_dump($phpdoc->hasTag('copyright'));
要使用反射,難道你不需要加載包含感興趣的類的PHP腳本?你如何做到這一點,爲一個任意長的PHP腳本列表? – 2010-04-03 15:32:34
@Ira請參閱http://php.net/manual/en/reflectionclass.getdoccomment.php上的示例 - 如果您想解析類的文件,可以使用http://github.com/theseer/Autoload/blob /master/src/classfinder.php並遍歷你可以使用的目錄http://php.net/manual/en/class.recursivedireiteiterator.php – Gordon 2010-04-03 16:00:29