正则表达式匹配PHP中的两个不同字符串

时间:2013-01-11 16:15:17

标签: php expression

如何查找包含helloEnglish并以.apk结尾的所有文件名。

我目前有一个正则表达式,用于查找包含hello并以.apk结尾的文件名。

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

3 个答案:

答案 0 :(得分:3)

你可以用正则表达式做到这一点,但你最终会得到丑陋/复杂/难以理解的表达。而是使用与逻辑运算符连接的简单条件的结合:

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

PHP缺少标准字符串函数,如contains()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()可以接受一个字符串数组并检查你的字符串是否全部包含它们或至少包含其中一个(取决于第二个参数中给出的某种标志)

答案 1 :(得分:1)

如果您在文件名中需要'hello'或'English',这个正则表达式应该可以解决问题:

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

答案 2 :(得分:1)

如果“英语”必须在“你好”之后出现:

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

如果它们可以按任何顺序排列:

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