2010-05-03 128 views
1

我有一個腳本,遞歸掃描目錄從php文件中拉出類名稱,並將這些類名稱存儲在一個數組中。即使通過相當大的Zend Framework庫文件夾,這也可以很好地工作。從PHP文件Preg_match類名

問題是擴展其他類的類沒有包含在數組中。

這裏是我當前的preg_match:

if (preg_match("/class\s*(\w*)\s*\{/i",strip_comments(file_get_contents($file)),$matches)) $classes[] = $matches[1]; 

我知道,最後\ S *是不正確的;應該有一些可以捕獲「{」或「擴展Some_Other_Class {」的東西。

回答

2

嘗試:

/^class ([a-zA-Z0-9_]+)/ 
+0

不詳盡,但應該得到大多數理智的。請參閱這裏的註釋:http://us2.php.net/manual/en/userlandnaming.php – cbednarski 2010-05-03 05:37:30

+0

啊,謝謝,我儘量保持它儘可能簡單,以避免在我的正則表達式中的錯誤。 – 2010-05-03 07:44:56

+0

請注意,您的正則表達式只會返回類名的第一個字符。 – icio 2010-05-03 09:27:48

0

你的模式應該簡單地採取的第一個字後面的class關鍵字是相對於當前的模式的類名看起來爲class關鍵字和開括號{之間一個字。如果你的類擴展了另一個類,這是有問題的,因爲分隔符之間不只是一個單詞,因此模式不匹配。

這裏有一個模式來嘗試:

/^\s*class\s+([a-zA-Z0-9_]+)/ 
+0

我試過了,但在某些情況下,在發送到拋出的異常的消息中出現「類」一詞。我使用「{」確保Im在「class」之後捕獲正確的單詞 – talentedmrjones 2010-05-04 21:42:09

+0

類名不會是整個匹配的字符串,而是第一個組。要訪問你需要調用'preg_match_all'來獲得'$ matches',然後從'foreach($ matches [1]作爲$ className)echo類名',\ n「;'。 此外,您是否可以提供一些測試用例以及您在執行代碼時是否存在其他問題? – icio 2010-05-04 23:45:43

0

我結束了使用此的foreach PHP文件中包含路徑:

$handle = @fopen($path.'/'.$dir, "r"); 
        $stop=false; 
        if ($handle) 
        { 
         while (!$stop&&!feof($handle)) 
         { 
          $line = fgets($handle, 4096); 
          $matches=array(); 
          if (preg_match('#^(\s*)((?:(?:abstract|final|static)\s+)*)class\s+'.$input.'([-a-zA-Z0-9_]+)(?:\s+extends\s+([-a-zA-Z0-9_]+))?(?:\s+implements\s+([-a-zA-Z0-9_,\s]+))?#',$line,$matches)) 
          { 
           $stop=true; 
           $classes[]=$matches[3]; 
          } 
         } 
         fclose($handle); 
        } 

似乎工作得很好。在另一個類似的Coda插件中找到它。唯一的問題是,它似乎有時會掛。不知道這是一個錯誤還是隻是緩慢。

2
'/class[\s\n]+([a-zA-Z0-9_]+)[\s\na-zA-Z0-9_]+\{/' 

這一個效果更好,因爲它支持誰擴展或實現類。

實施例:

class blah implements base 
{ 

將匹配。