使用正则表达式查找PHP锚点之间的特定匹配

时间:2013-02-26 20:16:19

标签: regex

如果我有以下代码并且想要使用正则表达式仅返回包含“function xyz”的PHP块:

<?php
  function xyz(
    // Code goes here
  )
?>

<!-- HTML code here -->

<?php
  // Other code
  echo "Its done!";
?>

我尝试执行以下正则表达式:/(<\?php).*function xyz。*(\?&gt;)/ s以获得以下结果:

<?php
  function xyz(
    // Code goes here
  )
?>

但是它没有得到预期的结果,而是最终给了我第一个“&lt; \?php”和最后一个“\?&gt;”之间的所有内容。任何人都可以建议正确的正则表达式语法来实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

Jack Maney提出了一个很好的观点,但是,根据您的具体情况,您可以使用

/<\?php.*function xyz.*?\?>/s

您需要使用 ungreedy / lazy 运算符,该运算符是您?+之后立即插入的*运算符。这两个量词(*和+)是贪婪的算子,这意味着它会抓住最长的匹配,而不是我们想要达到的最短匹配。

答案 1 :(得分:1)

尝试以下方法:

/(<\?php).*function xyz.*?(\?>)/s

唯一的区别是我将.*改为.*?。阅读更多相关信息here(在注意贪婪!