0

たとえば、次のようなものがあるとします。

$string = "^4Hello World ^5Foo^8Bar";

私は現在、キャレットと隣接する数字を置き換えるために次の関数を使用しています。これは、私が望むものに最も近いものです。

function addColours($input) {
    $var = $input;
    $var = str_replace('^0', '</span><span style="color: #000000">', $var);
    $var = str_replace('^1', '</span><span style="color: #ff0000">', $var);
    $var = str_replace('^2', '</span><span style="color: #00ff00">', $var);
    $var = str_replace('^3', '</span><span style="color: #ffff00">', $var);
    $var = str_replace('^4', '</span><span style="color: #0000ff">', $var);
    $var = str_replace('^5', '</span><span style="color: #00ffff">', $var);
    $var = str_replace('^6', '</span><span style="color: #ff00ff">', $var);
    $var = str_replace('^7', '</span><span style="color: #ffffff">', $var);
    $var = str_replace('^8', '</span><span style="color: #CC9933">', $var);
    $var = str_replace('^9', '</span><span style="color: #8D8D8D">', $var);
    return $var;
}

文字列に対して次を返します。

</span><span style="color: #0000ff">Hello World </span><span style="color: #00ffff">Foo</span><span style="color: #CC9933">Bar

文字列の中間部分では問題なく機能しますが、明らかに文字</span>列の先頭に不要なものを追加しており、終了タグを閉じていません。

これを機能させる方法はありますか?

ありがとう、ベン。

4

4 に答える 4

1

これは私がコメントで話していたことです:

$colorMap = array(
  '000000', // 0
  'ff0000', // 1
  '00ff00', // 2...     
);

$template = '<span style="color:#%s">%s</span>';

// split by "^" followed by 0-9
$parts = preg_split('/\^(\d)/', $string, -1,
            PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);

$result = '';

// rebuild string (odd elements are delimiters)
foreach($parts as $idx => $part)
  if((($idx % 2) === 0) && isset($colorMap[(int)$part]))
    $result .= sprintf($template, $colorMap[(int)$part], $parts[$idx + 1]);
于 2013-09-16T18:09:40.720 に答える
1

じゃあこれはどう?

function addColours($input) {
    $out = '';
    $replacements = array(
            '1' => '000000',
            '2' => 'ff0000'
    );

    foreach(explode('^', $input) as $span) {
        if(in_array($span[0], array_keys($replacements))) {
            $out .= '<span style="color: #' .  $replacements[$span[0]] . '">' . substr($span, 1) . '</span>';
        } else {
            $out .= $span;
        }
    }

    return $out;
}

$body = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. ^1Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. ^2It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";

print addColours($body);
于 2013-09-16T18:01:55.600 に答える
0

strreplaceではなく、preg replaceを実行する必要があります。ここでまだ出くわす問題は、スパンを正しく終了できるように、'^4Some Sentance ^' などのパターンを見つける必要があることです。しかし、エントリがタグが最後に使用されたときであり、それが閉じられていなかった場合はどうなるでしょうか? それは失敗するでしょう。

この形式に切り替えることをお勧めします。

[4]Some sentence[/4]

次に、単純な str_replace を正しく実行できます。

function addColours($input) {
    $replacements = array(
            '1' => '000000',
            '2' => 'ff0000'
    );

    foreach($replacements as $key => $value) {
        $input = str_replace("[$key]", '<span style="color: #' . $value . '">');
        $input = str_replace("[/$key]", '</span>');
    }

    return $input;
}
于 2013-09-16T17:47:05.970 に答える
0

これが私の2セントです。これは OP コードに最も近く、文字列を手動で再構築する必要はありません。

function addColours($input) {

  $var = $input;

  $var = preg_replace('/\^0(.*?)((\^\d)|($))/', '<span style="color: #000000">$1</span>$2', $var);
  $var = preg_replace('/\^1(.*?)((\^\d)|($))/', '<span style="color: #ff0000">$1</span>$2', $var);
  $var = preg_replace('/\^2(.*?)((\^\d)|($))/', '<span style="color: #00ff00">$1</span>$2', $var);
  $var = preg_replace('/\^3(.*?)((\^\d)|($))/', '<span style="color: #ffff00">$1</span>$2', $var);
  $var = preg_replace('/\^4(.*?)((\^\d)|($))/', '<span style="color: #0000ff">$1</span>$2', $var);
  $var = preg_replace('/\^5(.*?)((\^\d)|($))/', '<span style="color: #00ffff">$1</span>$2', $var);
  $var = preg_replace('/\^6(.*?)((\^\d)|($))/', '<span style="color: #ff00ff">$1</span>$2', $var);
  $var = preg_replace('/\^7(.*?)((\^\d)|($))/', '<span style="color: #ffffff">$1</span>$2', $var);
  $var = preg_replace('/\^8(.*?)((\^\d)|($))/', '<span style="color: #CC9933">$1</span>$2', $var);
  $var = preg_replace('/\^9(.*?)((\^\d)|($))/', '<span style="color: #8D8D8D">$1</span>$2', $var);

  return $var;

}
于 2013-09-16T18:22:53.990 に答える