【问题标题】:Substituting Words in a Body of Text with User Input via Multidimensional Arrays通过多维数组用用户输入替换正文中的单词
【发布时间】:2013-06-12 07:57:38
【问题描述】:

我有两组数据存储在多维数组中。一个存储正则表达式,用于在较大的文本正文中查找整个单词:

Array
(
    [red] => Array
        (
            [0] => ~\b(a)\b~i
            [1] => ~\b(b)\b~i
            [2] => ~\b(c)\b~i
        )
    [orange] => Array
        (
            [0] => ~\b(d)\b~i
        )
    [green] => Array
        (
            [0] => ~\b(e)\b~i
        )
)

另一个包含替换这些匹配项的内容:

Array
  (
    [red] => Array
        (
            [0] => <span class="red">A</span>
            [1] => <span class="red">B</span>
            [2] => <span class="red">C</span>
        )
    [orange] => Array
        (
            [0] => <span class="orange">D</span>
        )
    [green] => Array
        (
            [0] => <span class="green">E</span>
        )
)

出于示例目的,假设正文是:

敏捷的棕色狐狸跳过懒惰的狗。 a 敏捷的棕狐 跳过懒狗。 b 敏捷的棕狐跳过懒惰的 狗。 c 敏捷的棕色狐狸跳过懒惰的狗。 d 快速 棕狐跳过懒狗。 e

PHP 函数preg_replace 不处理多维数组,那我该如何完成呢?

【问题讨论】:

    标签: php regex arrays multidimensional-array preg-replace


    【解决方案1】:

    要处理您的数组,只需使用 foreach 循环:

    foreach($reg_cats as $key=>$reg_cat) {
        $yourstring = preg_replace($reg_cat, $rep_cats[$key], $yourstring);
    }
    

    $reg_cats 是您的正则表达式数组,$rep_cats 是您的替换数组。由于它们具有相同的键并且子数组具有相同的大小,因此您可以这样做。

    如果您不需要转换匹配的内容(这里您想将字母更改为大写),您可以使用单个关联数组:

    $corr = array('<span class="red">$0</span>'    =>  '~\b(?:a|b|c)\b~i',
                  '<span class="orange">$0</span>' =>  '~\bd\b~i',
                  '<span class="green">$0</span>'  =>  '~\be\b~i');
    
    $result = preg_replace($corr, array_keys($corr), $yourstring);
    

    【讨论】:

    • 为什么要避免使用多维数组?你有什么建议可以让我以类似的方式存储分类数据?
    • @daveycroqet:抱歉,我的第二个想法行不通,因为您需要将字母大写。
    • 我没有意识到 foreach 循环可以以这种方式处理键和元素。谢谢你教我。
    【解决方案2】:

    您需要将它们转换为可以使用的数组。 像这样的。

    $r=array();$s=$r;$n=0;
    foreach($Second_array_you_didn_t_name as $kk => $vv)
        foreach($vv as $k => $v)
        {
          $r[++$n]=$v;
          $s[$n]=$First_array_you_didn_t_name[$kk][$k]
        }
    $tqbf="The quick brown fox jumps over the lazy dog. a The quick brown fox jumps over the lazy dog. b The quick brown fox jumps over the lazy dog. c The quick brown fox jumps over the lazy dog. d The quick brown fox jumps over the lazy dog. e";
    print preg_replace($r,$s,$tqbf);
    

    【讨论】:

    • 我仍在玩弄这个并试图弄清楚。我会尽快回复你。感谢您的回复。
    【解决方案3】:

    假设两个数组的形状相似,只需像这样将两个数组展平:

    $search = call_user_func_array('array_merge', $search);
    $replace = call_user_func_array('array_merge', $replace);
    

    然后执行替换:

    preg_replace($search, $replace, $string);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2018-06-25
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多