【问题标题】:php - iterate with preg_replace?php - 用 preg_replace 迭代?
【发布时间】:2013-10-22 23:26:07
【问题描述】:

我想将preg_replace 与一个模式和一组完全不同的替换一起使用。换句话说,对于每次出现的匹配,我都想向下迭代替换数组以进行替换。

有没有办法做到这一点?

我尝试使用preg_replace_callback - 回调接受一组匹配项,但只返回一个字符串 - 无法判断您要替换哪个匹配项。

我还尝试使用 count 参数并将其传递给回调函数 - 每次都是 0,并且在 preg_replace 完成之后,然后告诉总匹配数。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    采纳@Andreas 的答案并稍微改进一下以提高性能:

    $count = 1;
    foreach ($replaceArray as $replace)
    {
      preg_replace($pattern, $replace, $subject, 1, $count);
    
      if ($count == 0) 
        break;
    }
    

    这将检查是否已执行替换,如果不是这样(因为没有更多匹配项),则放弃循环。如果$replaceArray 中的元素多于$subject 中的匹配项,这将节省性能。

    【讨论】:

    • 我没有投反对票,但实际上,我不需要那些额外的代码行,因为在我的特殊情况下,替换数组中的项目数量总是与我相同替换。
    【解决方案2】:

    尝试一些类似的东西:

    foreach ($replaceArray as $replace)
    {
        $subject = preg_replace($pattern, $replace, $subject, 1);
    }
    

    它会循环遍历你的替换数组,一次只替换 1 个。

    【讨论】:

      【解决方案3】:

      如果您创建一个与替换数组大小相同的模式数组,则无需迭代,例如:

      $string = 'obo oto oko';
      $pattern = '~o.o~i';
      $replacements = array('glip', 'glap', 'glop');
      
      $patterns = array_fill(0, count($replacements), $pattern);
      
      $result = preg_replace($patterns, $replacements, $string, 1);
      print_r($result);
      

      【讨论】:

      • 我确实需要迭代,我尝试过。问题是我用与模式匹配的字符串替换字符串。因此,对于数组中的每一项,preg_replace 会返回整个字符串并替换替换项。
      • @inorganik:你能编辑你的帖子并写一个输入、模式和期望输出的例子吗?
      • @Andreas 解决方案非常适合我。谢谢你的回答
      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2019-06-04
      • 1970-01-01
      • 2011-01-14
      • 2013-08-03
      相关资源
      最近更新 更多