繁体   English   中英

如何在 preg_match php 的相同正则表达式中找到任何关键字

[英]How to find any keyword in same regex in preg_match php

我有一个文本文件,我想像文件中有很多行一样搜索它,我想搜索每一行,它应该返回该行具有关键字“function”,并且应该从同一行调用 function。

表示我想在同一个正则表达式中搜索关键字。 例如。 如果 txt 文件的第 2 行有function f3但在该行中没有任何调用 function 的f3 ,请检查以下test.txt ,因此不应计算该行。 但是文本文件的第 3 行有function f1f1()也从同一行调用,所以它会被计数。

以下是我要从中搜索行的文件内容。

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 ([^\(])+\(.*$1\(\).*/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+\([^()]*\)).*\1;

解释

  • \bfunction\h+一个单词边界,匹配function和 1+ 个水平空白字符
  • (捕获组 1
    • \w+\([^()]*\)匹配 1+ 个单词字符和来自( ... )
  • )关闭第 1 组
  • .*\1; 使用反向引用\1后跟;在同一行匹配第 1 组中捕获的内容

正则表达式演示

$lines = explode("\n", file_get_contents('test.txt'));
$new_line = array();
foreach($lines as $line){
    if(preg_match('/\bfunction\h+(\w+\([^()]*\)).*\1;/', $line)){
        $new_line[] = $line;
    }
}
print_r($new_line);

Output

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+\([^()]*\)).*\1;/m', $lines, $m);
print_r($m[0]);

使用参数化函数有点棘手。 您可以首先匹配特定片段的所有 function 声明。 稍后您可以匹配 function 名称,仅查看它们是否被调用。 即使调用其中一个匹配项,我们也会在结果中添加该行。

<?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修饰符允许^匹配任何行的开头。

代码:(演示

$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\1.*~m',
        $text,
        $out
    )
    ? $out[0]
    : ''
);

Output:

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();',
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM