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

时间:2017-09-09 04:41:57

标签: php regex string preg-match

我试图使用正则表达式来获取包含特定单词的所有行"验证(否)"。我的代码段是:

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

var_dump($matches);

输出:

  

array(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)

3 个答案:

答案 0 :(得分:0)

使用preg_match_all取代所有可能的匹配

答案 1 :(得分:0)

您不必使用正则表达式来选择包含文字字符串的行。 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;
});

答案 2 :(得分:-1)

你可以分割线条(假设它们使用的是新线条或返回线条)然后使用preg_grep。

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

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


var_dump($matches);

上面的代码将返回带有“authenticate”文本的任何行。以下代码只返回带有“authenticate(no)”文本的行。

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

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

var_dump($matches);