2012-09-09 85 views
2

我的代碼如下所示,它聲明瞭一個類,並且它的名稱基於檢索到的字符串。但問題是,該字符串可能包含PHP不接受作爲類名稱的非法字符。那麼在使用它作爲類名之前是否有一種很好的方法來清理字符串?在PHP中爲法律變量名字使用字符串

$retrieved_string = 'some unformatted string; it may contain illegal characters to be passed as a class name.'; 

$strMyScript = basename(__FILE__, ".php"); 
$strMyScript = sanitize_variable($strMyScript); 
$strClassName = sanitize_variable($retrieved_string); 

eval(' 
    class ' . $strMyScript . '_' . $strClassName . ' extends AnotherClass { 
     // some code here 
    } 
'); 

funaction sanitize_variable($string) { 
    // sanitize the string 
} 
+0

匹配它對以下正則表達式:'[_a-ZA-Z] [_ A-ZA-Z0-9] *' – 2012-09-09 14:33:18

回答

1

首先決定你需要一個過濾器或驗證有效的標識符(講座,可變或函數的名稱)。驗證器將返回true/false。然後,您可以引發異常,爲用戶產生錯誤或者忽略該文件。另一種選擇是使用過濾器,它將有效地從輸入字符串中刪除字符。

public function sanitize($input) 
{ 
    $pattern = '/[^a-zA-Z0-9]/'; 

    return preg_replace($pattern, '', (string) $input); 
} 

您可能還想檢查unicode。該模式是:

public function sanitize($input) 
{ 
    if ([email protected]_match('/\pL/u', 'a')) 
    { 
     $pattern = '/[^a-zA-Z0-9]/'; 
    } 
    else 
    { 
     $pattern = '/[^\p{L}\p{N}]/u'; 
    } 
    return preg_replace($pattern, '', (string) $input); 
} 

問題也需要考慮:

  • 你要啓用空白支持?在這種情況下,您需要在$ pattern變量中添加一個空格。
  • 文件名是英文以外的語言嗎?然後,您需要執行一些特定於語言環境的操作來獲取最新的$模式。

HTH

+0

看來我的最後一條評論已被刪除,或者無法以某種方式提交。我從來沒有關於Unicode字符串可能包括在內。謝謝你提到它。我將尋找另一種方法,如使用'uniqid()'從文件修改日期生成唯一標識,以便我不需要過濾字符串。謝謝你的回答。 – Teno

+1

我想你的意思是:return preg_replace($ pattern,'',(string)$ input); (不是$ value) –

+0

好抓!謝謝@JiminyCricket –

1

有一個正則表達式PHP作者提供,請參閱manual entry on classes

<?php 

if (preg_match('/^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$/', $strClasssName)) { 
    // etc. 
} 

這是一個與函數名或其他任何標籤一樣。

如果你正在尋找消毒字符串,那麼也許你需要刪除的一切,這不是[a-zA-Z0-9_\x7f-\xff]然後驗證對^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$(不同的是,雖然整數允許的字符,一類/函數名不得以一個開始)。

+0

的preg_match(「/ ^([\ W \ D_ \ 0x7F部分 - \ xff] [\ w \ d_ \ x7f- \ xff] *)$ /',$ strClasssName,$ match)) - 用於字符串捕獲... – marklark

+0

'\ w'包含'\ d'和'_'所以不需要包含它們。其次,標籤不能以'\ d'開頭,所以第一個字符不能是'\ w'。另外,你可能想使用'u'(Unicode)修飾符。 – Alexei

+0

好點!謝謝 – marklark

2

您可以檢查一個字符串是否是使用

if (preg_match("/^[_a-zA-Z][_a-zA-Z0-9]*$/", $received_string)) { 
    // valid name 
} else { 
    // invalid name 
}