【问题标题】:preg_match_all not ignoring characters after pattern [duplicate]preg_match_all 不忽略模式后的字符[重复]
【发布时间】:2021-02-18 19:01:02
【问题描述】:

如果我的字符串是

<?php $str = 'hello world!'; function func_hello($str) { echo $str; }

我想在字符串中查找任何函数的名称

我正在使用代码

preg_match_all('%func_.* ?\(%', $c, $matches);

这是我正在做的一个基本示例。在现实世界中,我得到这样的结果

func_check_error($ajax_action_check, array(
func_post('folder') == '/' || func_post(
func_check_error($fvar_ajax_action_check, array(

而我希望结果是

func_check_error(
func_post(
func_check_error(

我尝试\b 设置边界,但它不起作用。即

preg_match_all('%\bfunc_.* ?\(\b%', $c, $matches);

【问题讨论】:

  • 您看到图案中的空格了吗?应该改为func_.*?\( 此外,使用正则表达式解析/分析代码可能会导致意外结果。
  • 空格是因为函数名和括号之间可以有空格,所以问号是可选的
  • func_.*? ?\( 这样的东西会阻止.* 占用太多空间。
  • 实际输入的字符串是什么? $c 的值是多少?

标签: php regex


【解决方案1】:

.* 捕获左括号,然后捕获第一个括号(函数名之后),因为下面的括号(数组中的一个)对应于您的模式的 \(

您应该对函数名称尝试更严格的条件,例如仅使用字母数字或括号以外的任何内容,也许将 func_.* 替换为 func_[^(]* 将在第一个括号匹配时停止

【讨论】:

  • func_[^(] 只返回第一个字符,例如func_c
  • 我忘了放*[^(] 在这里替换.
【解决方案2】:

简单的正则表达式应该可以正常工作:

~func_.*\(~

如果这没有给出您期望的结果,可能是由于您的代码以及您使用正则表达式的方式存在另一个问题。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2013-08-13
    • 2017-04-04
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多