【问题标题】:How should my PHP regular expression (regexp) look?我的 PHP 正则表达式 (regex) 应该是什么样子?
【发布时间】:2012-07-15 16:28:13
【问题描述】:

我有一个包含一些 HTML 和 PHP 文本的长字符串。在该字符串中,我想搜索所有出现的几个 PHP 函数调用并获取参数。现在我需要正则表达式方面的帮助。

要查找的函数:link_tolink_to_functionmail_to

我未完成的工作副本:

$regexp = '...' // Help here please!

$str = "Bla bla bla <?php echo link_to('Lorem', 'Ipsum') ?> bla bla bla <?php echo link_to_function(\"Lorem2\", \"Ipsum2\") ?> bla bla bla...";

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

我希望它返回如下内容:

$matches = array
(
  [0] => array
  (
    [0] => "link_to('Lorem', 'Ipsum')"
    [1] => "link_to_function(\"Lorem2\", \"Ipsum2\")"
  )
  [1] => array
  (
    [0] => "Lorem"
    [1] => "Lorem2"
  )
  [2] => array
  (
    [0] => "Ipsum"
    [1] => "Ipsum2"
  )
);

如您所见,参数可以用单引号和双引号括起来。参数中应该可以使用所有类型的字符。

还有一件事:每个调用都可以有一个两个参数。

【问题讨论】:

  • 一般来说,这是不可能的。正则表达式不能用于匹配任意数量的嵌套括号,这是一个问题,因为这是一个有效的函数调用:link_to(((a) + 2*(b+c)) * (d - e))
  • 好的,但在这种情况下,函数调用中的每个参数都被 ' 或 " 包围。也许这会改变一些事情?
  • 确实;如果在您的情况下总是如此,那么它很可能是可能的。

标签: php regex preg-match-all


【解决方案1】:

我认为您可能需要单独测试一个或两个参数。对于两个参数,你需要这样的东西:

"link_to.*?\(\s*'(.*?)'\,\s*'(.*?)'\s*\)"

如果您认为可能需要捕获双引号和单引号,请更改为:

"link_to.*?\(\s*['"](.*?)['"]\,\s*['"](.*?)['"]\s*\)"

【讨论】:

  • 谢谢,我会试试的。但它应该找到所有三种功能
  • 我只看到两个例子。您可能需要更新您的问题以显示所有三种类型。
  • 我写了“要查找的函数:link_to、link_to_function 和 mail_to”。对不起,如果我不清楚。
  • 您的解决方案不适用于我解释的标准。通过一些调整,它适用于两个函数调用都有两个参数的基本情况。但正如我所说,它可以是一个或两个......不起作用: $regexp = "/link_to.*?(\s*[\'\"](.*?)[\'\"]\ ,\s*[\'\"](.*?)[\'\"]\s*)/"; // 请在这里帮忙! $str = "Bla bla bla bla bla bla bla bla bla..."; preg_match_all ( $regexp, $str, $matches );回声'
    '; print_r($matches);回声'
    ';
  • 我在顶部说过该示例是针对两个参数的。我不会说用单一模式检查不同数量的参数是不可能的,但我不知道该怎么做。
【解决方案2】:

试试

[a-z_]+\(\s*(?:['"](.*?)['"],?\s*)*\)

如果有必要再完善一下,我手头没有php...

【讨论】:

  • 这似乎工作:"/(mail_to|link_to|link_to_function)(\s*[\'\"](.*?)[\'\"](\,\s* [\'\"](.*?)[\'\"]\s*)?)/".它同时处理一个和两个参数,但我还有另一个问题。如果函数调用看起来像 link_to('test ' . $test . 'test', 'test2') 我的正则表达式不起作用,因为第一个参数将像 "test" 而不是 "test' . $test 。 ' 测试” 我想要的......如何解决?
  • @AndersKristiansson 将['"] 更改为两个('") 并将其与最后的反向引用\n 匹配。所以这将匹配第一个参数('")(.*)\1。必须在每个应该匹配另一个子表达式的子表达式中增加反向引用:('")(.*)\2 等等。
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多