正则表达式 - 不包含某些字符preg_match

时间:2014-02-20 15:27:08

标签: php regex preg-match

如果数组包含某些it could anywhere,我需要一个匹配的正则表达式,例如,这个数组:

Array
(
[1] => Array
    (
        [0] => http://www.test1.com
        [1] => 4
        [2] => 4
    )

[2] => Array
    (
        [0] => http://www.test2.fr/blabla.html
        [1] => 2
        [2] => 2
    )

[3] => Array
    (
        [0] => http://www.stuff.com/admin/index.php
        [1] => 2
        [2] => 2
    )

[4] => Array
    (
        [0] => http://www.test3.com/blabla/bla.html
        [1] => 2
        [2] => 2
    )

[5] => Array
    (
        [0] => http://www.stuff.com/bla.html
        [1] => 2
        [2] => 2
    )

我想要返回除了包含单词stuff的数组之外的所有数组,当我尝试使用它进行测试时,它不能正常工作:

return !preg_match('/(stuff)$/i', $element[0]);

任何解决方案?

由于

2 个答案:

答案 0 :(得分:2)

您不需要正则表达式来执行简单搜索。将array_filter()strpos()结合使用:

$result = array_filter($array, function ($elem) {
    return (strpos($elem[0], 'stuff') !== FALSE);
});

现在,要回答您的问题,您当前的正则表达式模式只会匹配处包含stuff的字符串。你不希望这样,所以摆脱你的正则表达式中的“行尾”$

更新的正则表达式应如下所示:

return !preg_match('/stuff/i', $element[0]);

如果实际用例与您的问题中显示的不同,并且操作涉及的不仅仅是简单的模式匹配,那么preg_match()是正确的工具。如上所示,这可以与array_filter()一起使用,以创建满足您要求的新阵列。

以下是使用回调函数的方法:

$result = array_filter($array, function ($elem) {
    return preg_match('/stuff/i', $elem[0]);
});

注意:实际的正则表达式可能更复杂 - 我以/stuff/为例。另请注意,我已从声明中删除了否定!...

答案 1 :(得分:1)

您的模式只会匹配字符串或行末尾出现stuff的字符串。要解决这个问题,只需删除结束锚($):

return !preg_match('/stuff/i', $element[0]);