获取包含特定模式的所有可能行

问题描述:

我正在尝试使用正则表达式来获取包含特定单词“authenticate(no)”的所有行。我的代码段是:获取包含特定模式的所有可能行

$pattern = "/^.*\bauthenticate\b.*$/m"; 
$matches = array(); 
preg_match($pattern, $text, $matches); 

var_dump($matches); 

输出:

阵列(1){[0] =>串(54)“client.address = 10.50.131.0/24 身份验证(无) “}

它给我带来了一条线,这是第一条线符合条件。如何修改此以获取所有可能的行?

文本样本是:

ALLOW client.address=Wireless-Guest-Segment limit_bandwidth.client.inbound(Guest) limit_bandwidth.server.outbound(Guest) access_log[main](yes) 


client.address=10.50.131.0/24 authenticate(no) 

client.address=10.50.202.30 authenticate(no) 

client.address=10.50.202.18 authenticate(no) 

client.address=10.50.200.80 authenticate(no) 

client.address=10.50.202.31 authenticate(no) 

client.address=10.50.204.30 authenticate(no) 

client.address=10.50.204.164 authenticate(no) 

client.address=10.50.204.39 authenticate(no) 

client.address=10.50.204.123 authenticate(no) 

client.address=10.50.130.5 authenticate(no) 

authenticate(integrated_windows_authenticatio) authenticate.force(no) authenticate.mode(auto) 

使用preg_match_all,而不是把所有可能的匹配

您可以分割线(假设他们用的是新行或返回),然后使用一个preg_grep。

$pattern = "/^.*\bauthenticate\b.*$/m"; 

$matches = preg_grep($pattern, preg_split('/[\n\r]+/', $text)); 


var_dump($matches);

上面的代码将返回任何符合文本“认证”下面的代码将只与文本回线“身份验证(无)。

$pattern = "/authenticate\(no\)/"; 

$matches = preg_grep($pattern, preg_split('/[\n\r]+/', $text)); 

var_dump($matches);

你不必使用一个正则表达式来选择包含一个文字字符串的行strpos是这样做的函数,而不是将数据分成行或制作描述整行的模式,请逐行读取字符串或文件:

$handle = fopen("data:text/plain,$text", 'r'); // or fopen('/path/to/your/file', r); 

$results = []; 

while (false !== $line = stream_get_line($handle, 1024, "\n")) { // or "\r\n" 
    if (false !== strpos($line, 'authenticate(no)')) 
     $results[] = $line; 
} 

print_r($results); 

这种方式适用于字符串或文件。它是一个文件的优点是文件内容从未被完全加载到内存中,因为它被读为流。请注意,而不是存储在阵列中的结果,你可以以同样的方式(lazy evaluation)继续把while循环成产生一个结果,只有当你需要它,例如发电机:

$handle = fopen("data:text/plain,$text", 'r'); // or fopen('/path/to/your/file', r); 

function getLine($handle, $filter) { 
    while (false !== $line = stream_get_line($handle, 1024, "\n")) { 
     if (false !== strpos($line, $filter)) 
      yield $line; 
    } 
} 

foreach (getLine($handle, 'authenticate(no)') as $line) { 
    echo $line, PHP_EOL; 
} 

但如果出于任何原因,你需要的全部内容被加载,您可以使用file函数,返回行的数组,并与array_filter过滤这些线(或发现他们在一个简单的循环foreach):

$results = array_filter(file('/path/to/your/file'), function ($i) { 
    return strpos($i, 'authenticate(no)') !== false; 
});