0

我从六 (6) 个不同的文本区域中提取输入,以 \r\n 作为分隔符来分解数组,并循环遍历每组数据两次以替换它。

例如,我有 textarea 输入,人们可以在其中放置与列出的主要颜色相似的颜色,因此标题为“Blue”的 textarea 的输入可能是Aqua\r\nRoyal Blue\r\nTeal

然后我有类似数据的红色、橙色、黄色、绿色和紫色的输入框。

我想将用户输入(在本例中为 Aqua)替换为<span class="blue">Aqua</span>. 蓝色框中的任何输入都包含在“蓝色”类中,红色中的任何内容class="red"等等。

我已经让这一切工作得很好,循环遍历每组数据两次:一个 foreach 循环查找文本,另一个创建替换文本,最后简单地使用 preg_replace 实际执行替换。

$find_blue     = explode ("\r\n", $blue);
$replace_blue  = explode ("\r\n", $blue);

$i = 0;
foreach($replace_blue AS &$html)
{
  $find_blue[$i] = trim($find_blue[$i]);
  $html = '<span class="blue">' . $find_blue[$i] . '</span>';
  $i++;
}
foreach($find_blue AS &$found)
{
  $found = preg_quote(htmlspecialchars($found));
  $found = '~\b('.$found.')\b)~i';
}

$output = preg_replace($find_blue, $replace_blue, $output);

这工作得很好,但我认为这是一个笨拙的代码,有 12 个循环(每种颜色 2 个)都在做同样的事情。我想编写更简洁、更高效、更好的代码,并且我知道 array_merge 存在,但我不确定如何集成它或使所有内容保持一致和凝聚力。

4

1 回答 1

1

您可以创建一个函数来处理字符串,然后您只需要设置一个数组的值。

就像是:

<?php 
/**
 * key = colour to replace
 * value = data received from form
 */
$test_data_set = array(
'red'=>"Auburn\r\nBarn red",
'blue'=>"Aqua\r\nRoyal Blue\r\nTeal",
'green'=>"Amazon\r\nApple green\r\nArmy green",
);

//process
foreach($test_data_set as $color=>$input){
    $t = explode("\r\n",$input);
    array_walk($t, function(&$value, $key, $color){
        $value = '<span class="'.$color.'">' . trim($value) . '</span>';
    }, $color);
    $test_data_set[$color] = $t;
}

//debug
header('Content-Type: text/plain');
echo print_r($test_data_set,true);

/*  Result = $test_data_set
    Array
    (
        [red] => Array
            (
                [0] => <span class="red">Auburn</span>
                [1] => <span class="red">Barn red</span>
            )

        [blue] => Array
            (
                [0] => <span class="blue">Aqua</span>
                [1] => <span class="blue">Royal Blue</span>
                [2] => <span class="blue">Teal</span>
            )

        [green] => Array
            (
                [0] => <span class="green">Amazon</span>
                [1] => <span class="green">Apple green</span>
                [2] => <span class="green">Army green</span>
            )

    )
*/
于 2013-06-15T03:42:25.933 回答