2013-09-16 4 views
0

Допустим, у меня есть следующие для примера в целях:Замена нескольких частей строки

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

Я в настоящее время использую следующую функцию для замены CARETS и примыкающие число, которое ближе всего я мог добраться до что я хотел.

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> в начале строки, и это не закрывает закрывающий тег.

Есть ли способ сделать это!

Спасибо, Бен.

+0

почему бы не вместо 'return $ var;' просто сделать 'return $ var. ' '; '? – alfasin

+0

также, как насчет первого закрытия '' (что на самом деле ничего не закрывает)? – alfasin

+0

Я думаю, лучшее решение состоит в том, чтобы разбить строку на '\^\ d +' и обернуть каждую часть между тегами span ... –

ответ

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]); 
+0

Ах, блестящий. Большое спасибо. –

+0

PS- вы можете оставить 'isset()' проверить, содержит ли ваш массив все 10 элементов. –

+0

Это последнее обновление регулярного выражения сломало его кстати, оно работало как ''/(\^\ d)/'. –

0

Вам действительно нужно использовать замену preg, а не strreplace. Проблема, с которой вы все еще столкнетесь, заключается в том, что вам нужно найти такой тип, как «^ 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; 
} 
+0

К сожалению, '^ x' должны оставаться, если только нет способа изменить их, чтобы обернуть текст. –

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); 
+0

Работает блестяще, за исключением случаев, когда в начале строки находится каретка. –

+0

Можете ли вы привести пример, пожалуйста? – kwolfe

0

Вот мои два цента. Он наиболее близок к OPs-коду и не требует ручной перестройки строки.

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; 

} 
Смежные вопросы