Php preg_匹配以显示包含一个字符串和另两个字符串之一的行
我有一个php数组: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
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()
而不是循环。谢谢,它可以工作,但是看起来不容易修改。请描述您打算实现的修改。我会尽力解释。在你的例子中可能很难用更多的词。你认为它可以不考虑单词的位置吗?如果你有一个单词列表,正则表达式可以动态构建。也许,您不应该使用正则表达式方法。用感叹号分开,对照你的列表检查各个部分。如果你有某物怎么办!湖!伙计!空值
?这种解决方案不那么普遍。