正则表达式在函数体中查找某些单词


Regex to find certain words in function body

我想写一个正则表达式来查找$body->
后面的单词即在以下代码示例中userIddeviceIddeviceTokendeviceType

 function deviceUpdate($body)
 {  
    $userId=trim($body -> userId);
    $deviceId= $body -> deviceId;
    $deviceToken=trim($body -> deviceToken);
    $deviceType=trim($body -> deviceType);
 }

在 body 关键字之后和 -> 之后可以有一个空格或多个空格

我尝试的正则表达式是:

(?<=body ->'s)'S+

但是,如果body->之间没有空格,则无法正常工作。

编辑:我使用了正则表达式 ~function''s*(.+?((~ 查找函数的名称 ( 设备更新( 和 ~''$body''s*->''s*(''w+(~ 查找 body -> 运算符后的所有关键字。它工作得很好。假设,我有 2 个函数:

function deviceUpdate($body)
 {  
    $userId=trim($body -> userId);
    $deviceId= $body -> deviceId;
 }
function postad($body)
 {
    $adtitle = $body -> adtitle;
    $addescription = $body -> addescription;
  }
如何在 body -> 之后提取作为

deviceUpdate 的函数 1 名称和同一函数中的相应关键字,即 ( userId,deviceId( 在一个数组中,函数 2 名称 postad 和同一函数中的相应关键字在 body -> 之后,即 ( adtitle,addescription( 在第二个数组中

目前,当我如上所述使用preg_match_all和正则表达式时,它会在单个数组中返回它匹配的所有内容。

在您的解决方案中,您使用的是正向查看,在 PHP PCRE 正则表达式中,该回溯不能具有未定义的长度。

如果$body->用零个或多个空格分隔,则不能依赖固定宽度的后视。使用捕获并从匹配对象中抓取子匹配(要仅匹配带下划线的字母数字以避免匹配);,则需要将'S替换为'w(:

~'$body's*->'s*('w+)~

查看正则表达式演示

参见 IDEONE 演示:

$re = '~'$body's*->'s*('w+)~'; 
$str = " function deviceUpdate('$body)'n {  'n    '$userId=trim('$body -> userId);'n    '$deviceId= '$body -> deviceId;'n    '$deviceToken=trim('$body -> deviceToken);'n    '$deviceType=trim('$body -> deviceType);'n }"; 
preg_match($re, $str, $matches);
echo $matches[1]; // => userId

如果需要所有匹配项,请使用preg_match_all

preg_match_all($re, $str, $matches);
print_r($matches[1]);

查看其他 IDEONE 演示

要解决编辑问题,请执行以下操作

您可以使用

(?:'bfunction's+('w+)'([^()]*')'s*'{|(?!^'G))(?:(?!'bfunction's+'w+'([^()]*')'s+{|}'h*'r?'n).)*?'$body's*->'s*('w+)

查看正则表达式演示

在 PHP 中,将其用作

$re = '~(?:'bfunction's+('w+)'([^()]*')'s*'{|(?!^'G))(?:(?!'bfunction's+'w+'([^()]*')'s+{|}'h*'r?'n).)*?'$body's*->'s*('w+)~s'; 

查看 PHP 演示

上面的正则表达式使用(?:'bfunction's+('w+)'([^()]*')'s*'{|(?!^'G))指定的自定义边界和经过回火的贪婪令牌(?:(?!'bfunction's+'w+'([^()]*')'s+{|}'h*'r?'n).)*确保仅在一个函数中找到匹配

你去'('h*'$body'h*->'h*'K'w+(?='h*'))|='h*'$body'h*->'h*'K'w+(?='h*;)