使用正则表达式在PHP中从字符串中提取文本

3

我是一个php中的正则表达式小白,希望能从字符串中提取函数参数。我正在使用php解析javascript文件,并希望从一行代码中提取两个函数参数。以下是一些示例行:

"Backbone.Radio( 'comments ').trigger("added:comment " ,function(){});"

我希望从这一行中提取出单词commentsadded:comment,不包含任何空格或引号。

我已经尝试过以下方法:

$arrMatches = array();
$strRegEx = "/\\(\\s*['\"]\\s*([^)]+?)\\s*['\"]\\s*/";
$nMatches = preg_match_all($strRegEx, $strLine, $arrMatches);

但这会给我类似这样的东西:( 'comments '("added:comment "。 我希望能得到一些解决方法。

提取后无法“清理”它们吗?所以在获得结果后只需删除'"即可?或者这种方法会受到影响,因为注释本身可能包含括号? - A. L
我可以在提取后清理它们,但我更喜欢正则表达式只提取我需要的部分,这样我就不需要额外的步骤。 - sudden01
2个回答

2

您可以使用以下方法:

<?php

$regex = '~\(\h*([\'"])(.+?)\h*(?!\\\\)(?=\1)~';
$string = "Backbone.Radio( 'comments ').trigger(\"added:comment \" ,function(){});";

preg_match_all($regex, $string, $matches);
print_r($matches[2]);
/*
Array
(
    [0] => comments
    [1] => added:comment
)
*/
?>

这个正则表达式查找单引号/双引号,捕获它们,并查找下一个未转义的单引号/双引号。在regex101.com上演示


警告:虽然这在特定情况下可以工作,但通常使用正则表达式是最后的选择 - 是否考虑使用解析器?

非常感谢!这个非常好用。但是,如果我使用解析器有什么好处?并且对于这个例子,我应该使用哪个解析器? - sudden01
@sudden01:这完全取决于您的输入字符串。如果它们都是所提到的格式,那么这很可能会起作用。只有当您遇到嵌套括号时才会出现问题,例如 Backbone.Radio('comment_function("testparam")'),这在JS中是有效的。 - Jan
1
好的,那我认为正则表达式会很适合。我要检查的这些行总是有这个格式。再次感谢你的帮助,我会将你的答案标记为已接受的。 - sudden01

1
根据您的示例,类似以下内容可起到作用:
$re = "/(?<=\\()(?:[ '\"]*)([\\w\\d\\:]+)(?=[ ]*['\"]*)/"; 
$str = "\"Backbone.Radio( 'comments ').trigger(\"added:comment \" ,function(){});\""; 

preg_match_all($re, $str, $matches);

你可以根据需要将其他项目添加到匹配组中。

谢谢回复,这个也可以。由于我不是正则表达式专家,所以不知道哪个解决方案最好,但它们都适用于我的情况。 - sudden01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接