【问题标题】:Replace all commas BUT the main function ones?替换所有逗号但主要功能?
【发布时间】:2014-08-13 13:43:19
【问题描述】:

我在这里发帖是因为我已经搜索了几个小时的答案,并且在本网站 http://www.regexr.com/ 上尝试和错误中失去了更多其他人,以获得最佳的正则表达式。

除了第一个函数逗号之外,我找不到任何东西可以删除所有逗号。

#Quick Edit:我将始终将函数的内容作为字符串保存在我的 php 脚本中,因为我从发起函数调用的文件中复制了它。

这是一个例子:

MyClass::myFunction(
    array_merge($params, ['a', 'b', 'c', 'd']),
    array_merge(["p01"], ["s01", "s02", "s03"]),
    oi("s04", "p02", "p03"),
    [["p05", "p06", "p07"],],
    [
        oi(),
        "p04",
        ["p05", "p06", "p07"],
        oi("p08", "p09", "p10", ["s05", "s06", "s07"]),
    ],
    [
        "p04",
        ["p05", "p06", "p07"],
        oi("p08", "p09", "p10", ["s05", "s06", "s07"]),
    ]
)

我只想替换除 myFunction 之外的所有逗号(分隔它的参数是参数)。

我已经能够获取 myFunction 括号内的所有内容,因此您不必处理这些。


#Edit:我需要这个的原因是因为我为我的项目开发了一个调试函数,它准确地显示了生成该代码的变量/函数/事物。

oi() 函数只是一个随机函数,用于示例目的。在这种情况下,它将返回一个带有它接收到的参数的数组。

这是我的做法:

例子:

$variable = 'This is a test variable. For the purpose os testing, 2 + 2 is ' . ( 2 + 2 );
MyClass::myFunction($variable);
  1. 函数执行后,我通过 debug_backtrace() 获取函数调用参数。
  2. 我从执行它的文件中复制了被调用函数的全部内容,因此我将其作为字符串获取。
  3. 我只得到函数内部的内容,删除了 MyClass::myFunction( 和最后一个 )。
  4. 我将结果用逗号分解以获取函数的所有参数,但是这样,我将无法分解的逗号分解。我需要一种方法来找出我需要分解的逗号。

这是上面例子的最终结果(因为我不能发布图片,我会输入它):

<pre>
    <pre class="source">variable</pre>
    <pre class="content"><small>string</small>'This is a test variable. For the purpose os testing, 2 + 2 is 4' <i>(length=63)</i></pre>
</pre>

【问题讨论】:

  • 请重新表述您的核心问题。 为什么要删除逗号?从显示的源代码?那会破坏数组声明。目的是什么? oi() 是什么?
  • PHP 表达式语法不是常规语言 (afaik),所以你不能用 regex 真正做到这一点。
  • 为什么不使用现有的跟踪器/调试器?
  • @DanFromGermany - 你有什么建议可以做到我在这里想要实现的目标吗?我需要知道究竟是什么产生了该输出。无论是方法调用、数组、对象等等。
  • 感谢人们否定这个问题而不是说为什么......来自这个网站的真棒支持。我想要的只是一些提示......(y)

标签: javascript php regex


【解决方案1】:

感谢大家的帮助。

我想出了自己的解决方案。我希望它对任何人都有用。

public static function extractParams($text)
{
    $firstOpen = '';
    $close = ['(' => ')', '[' => ']', '"' => '"', '\'' => '\''];
    $open = ['[', '(', '"', '\''];
    $counter = 0;
    $splittedString = str_split($text);
    $p = '';
    $param = [];
    foreach ($splittedString as $char) {
        $p .= $char;
        if (!$firstOpen) {
            if (in_array($char, $open)) {
                $firstOpen = $char;
                $counter = 1;
            }
        } else {
            if ($char === $firstOpen && !in_array($char, ['"', '\''])) {
                $counter += 1;
            } elseif ($char === $close[$firstOpen]) {
                $counter -= 1;
            }
            if ($counter === 0) {
                $param[] = trim(ltrim($p, ','));
                $p = '';
                $firstOpen = '';
            }
        }
    }
    if ($param === []) {
        $param[] = trim(ltrim($p, ','));
    }
    return $param;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2021-07-13
    相关资源
    最近更新 更多