我想写一个正则表达式来查找$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*(.+?((~ 查找函数的名称 ( 设备更新( 和 ~''$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*;)