我想写一个正则表达式来查找$body->
之后的单词
以下代码示例中为userId
,deviceId
,deviceToken
和deviceType
:
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 和正则表达式时,如上所述,它会在单个数组中返回它匹配的所有内容。
答案 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]);
解决编辑问题:
您可以使用
(?:\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*;)