使用正则表达式在引号之间获取文本

时间:2010-04-27 17:07:30

标签: php regex string

我正在创建一些我正在创建的正则表达式的问题。

我需要一个正则表达式来匹配以下示例,然后在第一个引用的字符串上进行子匹配:

输入字符串

("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")

必须匹配

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

到目前为止

正则表达式:

\((["'])([^"']+)\1,?.*\)

正则表达式对第一组引号之间的文本进行子匹配,并返回上面显示的子匹配。

这几乎完美无缺,但我遇到的问题是,如果引用的字符串在文本中包含引号,则子匹配在第一个实例处停止,请参见下文:

输入字符串失败

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

仅限子匹配:Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

整场比赛失败。

备注

输入字符串实际上是php代码函数调用。我正在编写一个脚本来扫描特定函数的.php源文件,并从第一个参数中获取文本。

2 个答案:

答案 0 :(得分:6)

试试这个正则表达式:

\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\)

一些解释:

  • \(\s\* 匹配左括号和可选空格。
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*') 将匹配任何带引号的字符串,仅在使用\进行转义时才允许使用引号字符。
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))* 描述了零个或多个引号字符串,前面有一个,,前面和后面都有空格。
  • \s*\) 将右括号与可选空格相匹配。

答案 1 :(得分:0)

确保在转义报价时不匹配报价(前面有反斜杠):

/\((["'])([^"']+)[^\\]\1,?.*?\)/