Php 为什么在下面的程序中,匿名函数没有获得作为参数传递给它的整个数组或字符串?

Php 为什么在下面的程序中,匿名函数没有获得作为参数传递给它的整个数组或字符串?,php,arrays,string,arguments,anonymous-function,Php,Arrays,String,Arguments,Anonymous Function,考虑以下工作代码: <?php echo preg_replace_callback('~-([a-z])~', function ($match) { /*Below var_dump() outputs array(2) { [0]=> string(2) "-w" [1]=> string(1) "w" } var_dump($match);*/

考虑以下工作代码:

<?php
  echo preg_replace_callback('~-([a-z])~', function ($match) {
    /*Below var_dump() outputs
       array(2) {
         [0]=>
         string(2) "-w"
         [1]=>
         string(1) "w"
       }
    var_dump($match);*/
    return strtoupper($match[1]);
  }, 'hello-world');
  // outputs helloWorld
?>

我会在这里解释

你的Regx
“~-([a-z])~”
说:

  • -
    文字,匹配
    -
    一次
  • (…)
    捕获组,返回匹配结果
  • [a-z]
    字符集,通过
    z
    匹配
    a
回调的参数基于匹配项。您将获得匹配的
0
1
0
是Regx匹配的所有内容(包括
-
)。
1
first
capture组中的所有内容

因此,当你给它
hello world
时,匹配从
-
开始,在第一个
[a-z]
或在本例中是a
w
之后结束

现在,如果您添加了另一个捕获组,那么您将拥有match
2
。例如:

'~-([a-z])([a-z])~'
您将得到类似于
[0=>'-wo',1=>'w',2=>'o']
的结果

在线测试,在这里:

如果你把它改成

'~-([a-z]+)~'


它会给你
[0=>'-world',1=>'world']
,因为
+
匹配一次或多次,所以它匹配整个单词。

这里我将解释它

你的Regx
“~-([a-z])~”
说:

  • -
    文字,匹配
    -
    一次
  • (…)
    捕获组,返回匹配结果
  • [a-z]
    字符集,通过
    z
    匹配
    a
回调的参数基于匹配项。您将获得匹配的
0
1
0
是Regx匹配的所有内容(包括
-
)。
1
first
capture组中的所有内容

因此,当你给它
hello world
时,匹配从
-
开始,在第一个
[a-z]
或在本例中是a
w
之后结束

现在,如果您添加了另一个捕获组,那么您将拥有match
2
。例如:

'~-([a-z])([a-z])~'
您将得到类似于
[0=>'-wo',1=>'w',2=>'o']
的结果

在线测试,在这里:

如果你把它改成

'~-([a-z]+)~'

它将为您提供
[0=>'-world',1=>'world']
,因为
+
匹配了一次或多次,所以它匹配整个单词。

无法避免“完整字符串匹配”(输出数组中的
[0]
元素)。可以避免的是使用捕获组(以减少输出数组膨胀并提高regex效率)。您需要匹配连字符和字母,并且只返回字母——这样连字符就被删除了

下面是一个没有输出数组膨胀的等效方法:()

输出:

helloWorld
“fullstring匹配”(输出数组中的
[0]
元素)是不可避免的。可以避免的是使用捕获组(以减少输出数组膨胀并提高regex效率)。您需要匹配连字符和字母,并且只返回字母——这样连字符就被删除了

下面是一个没有输出数组膨胀的等效方法:()

输出:

helloWorld
我只是添加了另一个(可能是多余的)答案,因为我认为您主要误解了匿名/回调函数的任务。➜ 它应该做的很少

基本上这就是逻辑流程:

  • 您的输入字符串是
    'hello-world'

  • 相配

  • 正则表达式只从中提取
    '-w'

  • 您的回调函数仅接收该匹配项,拆分为$match=
    [“-w”,“w”]

    (@mickmack已经解释了原因)

  • 匿名函数只适用于匹配的部件/使用此摘录执行其替换魔法

    • 它从不工作,也不需要整个原始输入(
      helloworld

    • 因为它的意思是只将第二个单词的第一个字母大写,所以处理
      $match[1]
      就足够了

    • 因此,它只返回
      'W'

    • 回调函数的任务不是对整个/原始字符串进行替换

  • 它是对输入字符串执行实际替换任务的

    • 它将从匿名函数返回的与正则表达式匹配的
      '-w'
      替换为大写的
      'w'

    • 正如@ArtisticPhoenix所解释的,您可以更改regex和match,并让回调函数“更好地查看”手头的任务

  • 但是,对于实际用途来说,如果回调函数只看到一个字母并只返回该字母,这就足够了。

    我只是添加了另一个(可能是多余的)答案,因为我认为您主要误解了匿名/回调函数的任务。➜ 它应该做的很少

    基本上这就是逻辑流程:

  • 您的输入字符串是
    'hello-world'

  • 相配

  • 正则表达式只从中提取
    '-w'

  • 您的回调函数仅接收该匹配项,拆分为$match=
    [“-w”,“w”]

    (@mickmack已经解释了原因)

  • 匿名函数只适用于匹配的部件/使用此摘录执行其替换魔法

    • 它从不工作,也不需要整个原始输入(
      helloworld

    • 因为它的意思是只将第二个单词的第一个字母大写,所以处理
      $match[1]
      就足够了

    • 因此,它只返回
      'W'

    • 回调函数的作业<