如何在 preg_match php 中的同一正则表达式中查找任何关键字
How to find any keyword in same regex in preg_match php
我有一个文本文件,我想搜索它文件中有很多行,我想搜索每一行,它应该 return 该行具有关键字“function”并且应从同一行调用函数。
表示我想在同一个正则表达式中搜索关键字。
例如。请检查以下test.txt
是否txt 文件的第2 行有function f3
但该行没有任何f3
的调用函数,因此不应计算该行。
但是文本文件的第 3 行有 function f1
和 f1()
也从同一行调用,所以它会被计算在内。
以下是我要查找行的文件内容
test.txt
$xwbl209= "SN),AK mtyCcMXQHJ.T0-3qjfY5GnRl";
$k =5; function f3($a,$b,$c){ /*...*/ };
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aayw572 = f3($xwbl209{5},'',$xwbl209{10});
$k=10; function f2(){ /*...*/ }; $j=1; f1();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$b = "b"; function f5(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
我尝试使用下面的代码。
$lines = explode("\n", file_get_contents('test.txt'));
$new_line = array();
foreach($lines as $line){
if(preg_match(/somthing pattern/, $line)){
$new_line[] = $line;
}
}
print_r($new_line);
我也尝试了下面的模式,但它不起作用。
/function ([^\(])+\(.*\(\).*/g
$new_line
的输出应该如下所示。
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
你能帮帮我吗?
谢谢!!
一个选项可以使用
\bfunction\h+(\w+\([^()]*\)).*;
说明
\bfunction\h+
一个单词边界,匹配 function
和 1+ 个水平空白字符
(
捕获 组 1
\w+\([^()]*\)
匹配 1+ 个单词字符和来自 (
...)
)
关闭组 1
.*;
在同一行中使用反向引用 </code> 后跟 <code>;
匹配第 1 组中捕获的内容
$lines = explode("\n", file_get_contents('test.txt'));
$new_line = array();
foreach($lines as $line){
if(preg_match('/\bfunction\h+(\w+\([^()]*\)).*;/', $line)){
$new_line[] = $line;
}
}
print_r($new_line);
输出
Array
(
[0] => function f1(){ /*...*/ }; $a=1; $b=5; f1();
[1] => $aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
[2] => $aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
)
或使用 preg_match_all 的更短变体:
$lines = file_get_contents('test.txt');
preg_match_all('/^.*?\bfunction\h+(\w+\([^()]*\)).*;/m', $lines, $m);
print_r($m[0]);
使用参数化函数有点棘手。您可以首先匹配特定代码段的所有函数声明。稍后您可以只匹配函数名称以查看它们是否被调用。即使调用了其中一个匹配项,我们也会将该行添加到结果中。
<?php
$result = [];
foreach(explode("\n",file_get_contents('test.txt')) as $line){
preg_match_all('/\bfunction ([^\(]+)/',$line,$matches);
foreach($matches[1] as $function_name){
if(preg_match('/\b' . preg_quote($function_name) . '\((.+?)\);/',$line)){
$result[] = $line;
break;
}
}
}
print_r($result);
不需要循环。您不需要将您的 txt 文件分成一行行。
m
修饰符允许 ^
匹配任何行的开头。
代码:(Demo)
$text = <<<'TEXT'
$xwbl209= "SN),AK mtyCcMXQHJ.T0-3qjfY5GnRl";
$k =5; function f3($a,$b,$c){ /*...*/ };
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aayw572 = f3($xwbl209{5},'',$xwbl209{10});
$k=10; function f2(){ /*...*/ }; $j=1; f1();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$b = "b"; function f5(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
TEXT;
var_export(
preg_match_all(
'~^.*?\bfunction\h+(\w+\([^()]*\)).*\b.*~m',
$text,
$out
)
? $out[0]
: ''
);
输出:
array (
0 => 'function f1(){ /*...*/ }; $a=1; $b=5; f1();',
1 => '$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();',
2 => '$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();',
)
我有一个文本文件,我想搜索它文件中有很多行,我想搜索每一行,它应该 return 该行具有关键字“function”并且应从同一行调用函数。
表示我想在同一个正则表达式中搜索关键字。
例如。请检查以下test.txt
是否txt 文件的第2 行有function f3
但该行没有任何f3
的调用函数,因此不应计算该行。
但是文本文件的第 3 行有 function f1
和 f1()
也从同一行调用,所以它会被计算在内。
以下是我要查找行的文件内容
test.txt
$xwbl209= "SN),AK mtyCcMXQHJ.T0-3qjfY5GnRl";
$k =5; function f3($a,$b,$c){ /*...*/ };
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aayw572 = f3($xwbl209{5},'',$xwbl209{10});
$k=10; function f2(){ /*...*/ }; $j=1; f1();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$b = "b"; function f5(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
我尝试使用下面的代码。
$lines = explode("\n", file_get_contents('test.txt'));
$new_line = array();
foreach($lines as $line){
if(preg_match(/somthing pattern/, $line)){
$new_line[] = $line;
}
}
print_r($new_line);
我也尝试了下面的模式,但它不起作用。
/function ([^\(])+\(.*\(\).*/g
$new_line
的输出应该如下所示。
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
你能帮帮我吗? 谢谢!!
一个选项可以使用
\bfunction\h+(\w+\([^()]*\)).*;
说明
\bfunction\h+
一个单词边界,匹配function
和 1+ 个水平空白字符(
捕获 组 1\w+\([^()]*\)
匹配 1+ 个单词字符和来自(
...)
)
关闭组 1.*;
在同一行中使用反向引用</code> 后跟 <code>;
匹配第 1 组中捕获的内容
$lines = explode("\n", file_get_contents('test.txt'));
$new_line = array();
foreach($lines as $line){
if(preg_match('/\bfunction\h+(\w+\([^()]*\)).*;/', $line)){
$new_line[] = $line;
}
}
print_r($new_line);
输出
Array
(
[0] => function f1(){ /*...*/ }; $a=1; $b=5; f1();
[1] => $aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
[2] => $aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
)
或使用 preg_match_all 的更短变体:
$lines = file_get_contents('test.txt');
preg_match_all('/^.*?\bfunction\h+(\w+\([^()]*\)).*;/m', $lines, $m);
print_r($m[0]);
使用参数化函数有点棘手。您可以首先匹配特定代码段的所有函数声明。稍后您可以只匹配函数名称以查看它们是否被调用。即使调用了其中一个匹配项,我们也会将该行添加到结果中。
<?php
$result = [];
foreach(explode("\n",file_get_contents('test.txt')) as $line){
preg_match_all('/\bfunction ([^\(]+)/',$line,$matches);
foreach($matches[1] as $function_name){
if(preg_match('/\b' . preg_quote($function_name) . '\((.+?)\);/',$line)){
$result[] = $line;
break;
}
}
}
print_r($result);
不需要循环。您不需要将您的 txt 文件分成一行行。
m
修饰符允许 ^
匹配任何行的开头。
代码:(Demo)
$text = <<<'TEXT'
$xwbl209= "SN),AK mtyCcMXQHJ.T0-3qjfY5GnRl";
$k =5; function f3($a,$b,$c){ /*...*/ };
function f1(){ /*...*/ }; $a=1; $b=5; f1();
$aayw572 = f3($xwbl209{5},'',$xwbl209{10});
$k=10; function f2(){ /*...*/ }; $j=1; f1();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();
$b = "b"; function f5(){ /*...*/ }; $b=1; f4();
$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();
$bhzs038 = f3($xwbl209{5},$xwbl209{6},$xwbl209{8});
TEXT;
var_export(
preg_match_all(
'~^.*?\bfunction\h+(\w+\([^()]*\)).*\b.*~m',
$text,
$out
)
? $out[0]
: ''
);
输出:
array (
0 => 'function f1(){ /*...*/ }; $a=1; $b=5; f1();',
1 => '$aa = "aa"; function f4(){ /*...*/ }; $b=1; f4();',
2 => '$aa = "aa"; function f6(){ /*...*/ }; $b=1; f6();',
)