【问题标题】:Could you tell how to replace by regular expression你能告诉如何用正则表达式替换
【发布时间】:2010-07-30 15:04:16
【问题描述】:

你能告诉如何用preg-replace替换字符串(需要正则表达式):

/user/{parent_id}/{action}/step/1

在数组的等价值处:

array('parent_id'=>32, 'action'=>'some');

制作:

/user/32/some/step/1

加法

这是一个典型的问题,所以我可能不知道变量的名字是什么来的

【问题讨论】:

  • 我重新标记了问题str-replace,因为这与正则表达式无关。正则表达式用于替换任何 not 常量,而您正在替换常量字符串。
  • @mvds 实际上,您可能需要正则表达式来替换不变的内容,例如如果您对要替换的主题的相邻文本有要求。
  • @artefact:是的,但我不认为 OP 正在考虑前瞻或后瞻断言,是吗?
  • (顺便说一句,它甚至不需要是相邻的文本,前瞻也可能看起来很远;-))

标签: php preg-replace str-replace


【解决方案1】:

您可以使用str_replace

例如:

str_replace(array("{parent_id}", "{action}"), array(32, 'some'), "/user/{parent_id}/{action}/step/1");

【讨论】:

  • 这是一个典型的问题,所以我大概不会知道变量的名字是什么来的
  • 你能提供你会知道的数据吗?它可以帮助我修改我的答案。
【解决方案2】:
$arr = array('parent_id'=>32, 'action'=>'some');

$out = str_replace(array_keys($arr),array_values($arr),$in);

不需要正则表达式!

【讨论】:

    【解决方案3】:

    假设你有:

    $arr = array('parent_id'=>32, 'action'=>'some');
    $in =  '/usr/{parent_id}/{action}/step/1';
    

    这将替换大括号:

    function bracelize($str) {
        return '{' . $str . '}';
    }    
    
    $search = array_map('bracelize', array_keys($arr));
    $out = str_replace($search, $arr, $in);
    

    或者,如果您使用的是 PHP >= 5.3,您可以使用 lambda:

    $search = array_map(function ($v) { return '{'.$v.'}';}, array_keys($arr));
    $out = str_replace($search, $arr, $in);
    

    【讨论】:

      【解决方案4】:
      $s = '/user/{parent_id}/{action}/step/1';
      $replacement = array('parent_id'=>32, 'action'=>'some');
      $res = preg_replace(array('/\\{parent_id\\}/', '/\\{action\\}/'), $replacement, $s);
      

      当然,你也可以使用str_replace(事实上,你应该)。

      【讨论】:

        【解决方案5】:
        <?php
          $string = '/usr/{parent_id}/{action}/step/1';
          $pattern = array('#{parent_id}#', '#{action}#');
          $values = array('32', 'some');
        
          echo preg_replace($pattern, $values, $string);
        ?>
        

        如果您的问题没有比这更复杂,我建议您将 preg_replace 更改为 str_replace。

        编辑:我看到您事先不知道变量名称。在这种情况下,您可以这样做。

        <?php
          function wrap_in_brackets(&$item)
          {
            $item = '{' . $item . '}';
            return true;
          }
        
          $string = '/usr/{parent_id}/{action}/step/1';
          $variables = array('parent_id' => 32, 'action' => 'some');
        
          $keys = array_keys($variables);
          array_walk($keys, 'wrap_in_brackets');
          echo str_replace($keys, array_values($variables), $string);
        ?>
        

        【讨论】:

          【解决方案6】:

          扩展 mvds 的答案:

          $in  = 'user/{parent_id}/{action}/step/1';
          $arr = array('{parent_id}' => 32, '{action}' => 'some');
          $out = str_replace(array_keys($arr), $arr, $in);
          

          或者:

          $in    = 'user/{parent_id}/{action}/step/1';
          $arr   = array('parent_id' => 32, 'action' => 'some');
          $arr[] = '';
          $find  = array_merge(array_keys($arr), array('{', '}'));
          $out   = str_replace($find, $arr, $in);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            • 2019-01-24
            • 1970-01-01
            • 2016-01-06
            • 2020-11-05
            • 2014-03-29
            • 1970-01-01
            相关资源
            最近更新 更多