2013-01-11 27 views

回答

3

你可以用正則表達式來做到這一點,但最終會出現醜陋/複雜/難以辨認的表情。而是使用的simplier條件結合邏輯運算符togheter加入:

if (strpos($filename, 'hello') !== 0 && strpos($filename, 'English') !== 0 && substr($filename, -4) === '.apk') { 
    // filename matches 
} 

PHP的缺乏標準的字符串函數像或starts|endsWith()使上面的代碼有點難看,但沒有什麼是斯特普您創建一個幫手,實用工具類:

class StringHelper { 
    private $subject; 

    public function __construct($subject) { 
     $this->subject = $subject; 
    } 

    public function contains($substring) { 
     return strpos($this->subject, $substring) !== false; 
    } 

    public function endsWith($string) { 
     return substr($this->subject, strlen($string) * -1) === $string; 
    } 
} 

那麼你if變得更簡單:

$filename = new StringHelper($filename); 

if ($filename->contains('hello') && $filename->contains('English') && $filename->endsWith('.apk')) { 
    // matches 
} 

提示:而不是創建StringHelper對象,您可以使用「古典」StringUtilis類與一堆靜態方法接受$string作爲它們的第一個參數。

提示:StringHelper::contains()可以接受字符串數組,並檢查字符串是否包含他們全部或其中至少一個(取決於某種在第二個參數給出一個標誌)。

+0

我喜歡這個:-) –

+0

+1這可以幫助你現在和幫助未來的問題。 – Josh

+0

如果不在對象上下文中,這會給出使用$ this的錯誤? –

1

此正則表達式應該做的伎倆,如果你在文件名需要「你好」或「英語」:

/.*(hello|English).*\.apk$/

+0

但它只會檢查'hello'和'English' –

+0

這是OR,他需要AND。 –

+3

他需要什麼不清楚:p – magnetik

1

如果「英文」必須出現在「你好」:

if(preg_match('/.*hello.*English.*\.apk$/i', $filename)); 

如果他們可以在任何順序:

if(preg_match('/(hello.*English|English.*hello).*\.apk$/i', $filename)); 
+0

是否有一個版本說明 - 必須匹配hello和英語(以任何順序)並以.apk結尾? –

+0

'/(hello.*English|English.*hello)。* \。apk $/i''應該可以工作,即使可能有更優雅的方式。 – glomad

+0

@ithcy,修復您對未來觀衆的回答。 –