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

时间:2016-02-13 15:27:51

标签: php regex

我想写一个正则表达式来查找$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 *(。+?)(〜来查找函数名称(deviceupdate)和〜\ $ body \ s * - &gt; \ s *(\ w +)〜查找body - &gt;运算符后的所有关键字。它工作得很好。假设我有2个函数:

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

 }

function postad($body)
 {

    $adtitle = $body -> adtitle;
    $addescription = $body -> addescription;

  }

如何在 正文 - &gt; 之后(userId)提取 deviceUpdate 的功能名称和相同功能的相应关键字,deviceId)在一个数组和函数2名称 postad 和相同的函数中的相应关键字 body - &gt; 即(adtitle,addescription) )在第二个阵列?

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

2 个答案:

答案 0 :(得分:4)

在您的解决方案中,您使用的是正面后瞻,在PHP PCRE正则表达式中,不能是未定义的长度。

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

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

请参阅regex demo

请参阅IDEONE demo

$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]);

请参阅another IDEONE demo

解决编辑问题

您可以使用

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

请参阅regex demo

在PHP中,将其用作

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

请参阅PHP demo

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

答案 1 :(得分:1)

在这里你\(\h*\$body\h*->\h*\K\w+(?=\h*\))|=\h*\$body\h*->\h*\K\w+(?=\h*;)