获取包含特定模式的所有可能行
问题描述:
我正在尝试使用正则表达式来获取包含特定单词“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;
});