如何匹配配对的闭合括号与正则表达式

时间:2016-04-01 13:14:39

标签: php regex vqmod

我当前的正则表达式匹配函数名称和传递给函数see here

的变量名称

正则表达式 - (file_exists|is_file)\(([^)]+)
字符串 if (is_file($file)){
匹配 is_file$file

我还希望正则表达式使用字符串而不仅仅是变量名称,这包括具有多个开始和结束括号的字符串。

这是一个极端的例子。

正则表达式 - (file_exists|is_file)\(????????)
字符串 if (is_file(str_replace(array('olddir'), array('newdir'), strtolower($file))){
匹配 is_filestr_replace(array('olddir'), array('newdir'), strtolower($file)

除非有人打开,否则有没有办法匹配下一个结束括号?

我想让它在regex101

工作

1 个答案:

答案 0 :(得分:1)

您可以在PHP中使用带有子例程调用的正则表达式:

'~(file_exists|is_file)(\(((?>[^()]++|(?2))*)\))~'

请参阅regex demo

模式匹配:

  • (file_exists|is_file) - 两种选择之一
  • (\(((?>[^()]++|(?2))*)\)) - 第1组匹配已配对的嵌套(...)子字符串,((?>[^()]++|(?2))*)为第3组,捕获外部配对(...)内的内容。

因此,结果如下:

  • 第1组:is_file
  • 第2组:(str_replace(array(), array(), strtolower($file)))
  • 第3组:str_replace(array(), array(), strtolower($file))

使用第1组和第3组。