我试图使用正则表达式来获取包含特定单词的所有行"验证(否)"。我的代码段是:
$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)
答案 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);