Php preg_匹配以显示包含一个字符串和另两个字符串之一的行

Php preg_匹配以显示包含一个字符串和另两个字符串之一的行,php,regex,preg-match,Php,Regex,Preg Match,我有一个php数组: Array ( [0] => sth!Man!Tree!null [1] => sth!Maning!AppTree!null [2] => sth!Man!Lake!null [3] => sth!Man!Tree!null [4] => sth!Man!AppTree!null [5] => sth!Maning!AppTree!null [6] => sth!Man!Tr

我有一个php数组:

Array
(
    [0] => sth!Man!Tree!null
    [1] => sth!Maning!AppTree!null
    [2] => sth!Man!Lake!null
    [3] => sth!Man!Tree!null
    [4] => sth!Man!AppTree!null
    [5] => sth!Maning!AppTree!null
    [6] => sth!Man!Tree!null
    [7] => sth!Maning!AppTree!null
    [8] => sth!Maning!AppTree!null
    [9] => sth!Man!Tree!null
   [10] => sth!Man!Tree!null
   [11] => sth!Man!Tree!null
   [12] => sth!Man!Tree!null
   [12] => sth!Man!Lake!null
   [13] => sth!Maning!Tree!null
)
这个预匹配函数:

preg_match("/Man/i", $line) && (preg_match("/!Tree!/i", $line) || preg_match("/!Lake!/i", $line))

我的目标是将其更改为一个preg_match regex函数,以便仅显示包含人与树或人与湖的线条。有可能吗?

预匹配(/Man!(?:Tree | Lake)/i“,$line,$matches)
应该最有效地完成这项工作。

您可以使用以下正则表达式:

(?i)\b(?:Lake|Tree)\b.*\bMan\b|\bMan\b.*\b(?:Tree|Lake)\b

单词边界只匹配整个单词,
(?i)
内联模式选项启用不区分大小写的搜索,并且我们需要至少两个主要选项来解释
人和
湖的不同位置

示例代码:

$re = "/(?i)\\b(?:Lake|Tree)\\b.*\\bMan\\b|\\bMan\\b.*\\b(?:Tree|Lake)\\b/"; 
$str = " Man and Tree or Man and Lake. Is it possible?"; 
preg_match($re, $str, $matches);

我将使用
preg_grep()
而不是循环。谢谢,它可以工作,但是看起来不容易修改。请描述您打算实现的修改。我会尽力解释。在你的例子中可能很难用更多的词。你认为它可以不考虑单词的位置吗?如果你有一个单词列表,正则表达式可以动态构建。也许,您不应该使用正则表达式方法。用感叹号分开,对照你的列表检查各个部分。如果你有
某物怎么办!湖!伙计!空值
?这种解决方案不那么普遍。