2014-12-16 2 views
5

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

function GetBetween($content,$start,$end){ 
    $r = explode($start, $content); 

    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 

function srthhcdf($string){ 
    $innerCode = GetBetween($string, '[coupon]', '[/coupon]'); 
    $iat = explode('&&', $innerCode); 
    $string = str_replace('[coupon]','',$string); 
    $string = str_replace('[/coupon]','',$string); 
    $newtext = '<b>'.$iat[0].'</b> <i>'.$iat[1].'</i><b>'.$iat[2].'</b>'; 
    $string = str_replace($innerCode,$newtext,$string); 
    return $string; 
} 
$Text = srthhcdf($Text); 

Но это соответствует только первым [купон] и [/ coupon] не другим. Например, когда строка

hello world [coupon]hello && bad && world[/coupon] and also to [coupon] the && bad && world [/coupon] 

Он выводит

Hello world <b>hello </b> <i> bad </i><b> world</b> and also to the && bad && world. 

что означает замену [coupon] и [/coupon] каждый раз, но не форматирует текст внутри них каждый раз.

+0

может быть петля поможет –

+0

вы можете предоставить ан пример строки и результат вы ожидаете? – krzysiej

+0

, но текст извлекается из mysql и его что-то вроде сообщения Wordpress. Итак, сколько я должен запустить цикл. – IdidntKnewIt

ответ

1

Проверьте мое решение. Ваша проблема в том, что вы заменяете коды после первого звонка, и нет петли:

function GetBetween($content, $start, $end) { 
    $pieces = explode($start, $content); 
    $inners = array(); 
    foreach ($pieces as $piece) { 
     if (strpos($piece, $end) !== false) { 
      $r = explode($end, $piece); 
      $inners[] = $r[0]; 
     } 
    } 
    return $inners; 
} 

function srthhcdf($string) { 
    $innerCodes = GetBetween($string, '[coupon]', '[/coupon]'); 
    $string = str_replace(array('[coupon]', '[/coupon]'), '', $string); 
    foreach ($innerCodes as $innerCode) { 
     $iat = explode('&&', $innerCode); 
     $newtext = '<b>' . $iat[0] . '</b> <i>' . $iat[1] . '</i><b>' . $iat[2] . '</b>'; 
     $string = str_replace($innerCode, $newtext, $string); 
    } 
    return $string; 
} 

$testString = "hello world [coupon]hello && bad && world[/coupon] and also to [coupon] the && bad && world [/coupon]"; 
$Text = srthhcdf($testString); 
echo $Text; 
+0

жаль говорить, но; Предупреждение: неверный аргумент, предоставленный foreach() в /srv/users/st/apps/cour/public/single.php в строке 20 – IdidntKnewIt

+0

Это сработало для меня. Попробуйте использовать пустой php-файл. – vaso123

+0

Отлично работает. Лучший ответ на вопрос. – IdidntKnewIt

0

Решение с Regex (захватит весь текст и [купон] [/ купон] и заменить их новой строки

preg_replace('#\[coupon\][A-Z0-9]+\[/coupon\]#i', $replaceText, $content); 

если вы хотите сохранить ваши [купонных] теги:

preg_replace('#(\[coupon\])[A-Z0-9]+(\[/coupon\])#i', '$1'.$replaceText.'$2', $content); 
1

с помощью Regex будет простым решением для такого рода вещей

$Text = "hello world [coupon]hello && bad && world[/coupon] and also to [coupon] the && bad && world [/coupon]"; 

$result = preg_replace('%\[coupon]([^[]*)\[/coupon]%', '<i>\1</i>', $Text); 

print $result; 
1

Попробуйте этот код вместо:

$Text = 'hello world [coupon]hello && bad && world[/coupon] and also to [coupon] the && bad && world [/coupon]'; 

echo preg_replace('#\[coupon\][\s]*(\w+)([\s&]+)(\w+)([\s&]+)(\w+)[\s]*\[\/coupon\]#i', '<b>$1</b> <i>$3</i><b>$5</b>', $Text); 
Смежные вопросы