2016-11-25 2 views
2

Я получил некоторый текст в HTML, как этот

<p>Test test test $v1 $v2 $v3 $v11</p> 

С PHP Мне нужно заменить $ v1 $ v2 $ v3 ... $ v9, мне не нужно заменить $ v10 ... $ v *****

Моя проблема в том, когда у меня есть $ v11 в моем тексте это замена $ v1 + 1 в конце:

$v1 = "here"; 
... 
What I got actually : Test test test $v11 => Test test test here1 
I need :Test test test $v11 => Test test test 

$ вары массив в PHP:

$v1 = "here"; 
$v2 = ""; 
$v3 = ""; 
$v4 = ""; 
$v5 = ""; 
$v6 = ""; 
$v7 = ""; 
$v8 = ""; 
$v9 = ""; 
$vars = array($v1,$v2,$v3,$v4,$v5,$v6,$v7,$v8,$v9); 

Моя функция

function replaceVar($vars, $string) 
{ 
    $stringReplace = '$v'; 
    $i = 1; 
    while ($i <= 9) { 
    if(!empty($vars[$i]) && strlen($stringReplace . $i) == 3) 
    { 
     $string = str_replace('$v' . $i, $vars[$i], $string); 
    } 
    else 
    { 
     $string = str_replace('$v' . $i, "", $string); 
    } 
    $i++; 
    } 
    return $string; 
} 

Освобожденные выход: $ вары массив в PHP:

$v1 = "here"; 
$v2 = ""; 
$v3 = ""; 
$v4 = ""; 
$v5 = ""; 
$v6 = ""; 
$v7 = ""; 
$v8 = ""; 
$v9 = ""; 
$vars = array($v1,$v2,$v3,$v4,$v5,$v6,$v7,$v8,$v9); 

echo replaceVar($vars, "Test test test $v1 $v2 $v11"); 

Тест тест тест здесь

+0

Не ясно, вам нужно получить «тест тест тест здесь» или " Тестовый тестовый тест здесь here1 « – user3099298

+0

Фактически он заменяет $ v11 на содержимое переменной $ v1 + 1, потому что он заменяет $ v1 в $ v11 – Sydowh

ответ

1

Вы можете использовать preg_replace_callback для этого. Попробуйте следующее

<?php 
$str = '<p>Test test test $v1 $v2 $v3 $v11</p>'; 

$v1 = "here"; 
$v2 = ""; 
$v3 = ""; 
$v4 = ""; 
$v5 = ""; 
$v6 = ""; 
$v7 = ""; 
$v8 = ""; 
$v9 = ""; 
$vars = array($v1,$v2,$v3,$v4,$v5,$v6,$v7,$v8,$v9); 

echo preg_replace_callback('/\$v(\d)\s/', 
     function($match) use ($vars) { return ($vars[$match[1]-1]) . ' '; }, 
     $str); 

Примечание: return ($vars[$match[1]-1])-1 это там, потому что ваш 0th элемент в $vars массива фактически для $v1

Demo Here

Примечание: Я предполагаю, что есть место после того, как &v1, иначе вам, возможно, придется менять матч и замену.

Пояснение:

'/\$v(\d)\s/' матч за $ V и цифра и пространство

return ($vars[$match[1]-1]) . ' '

для каждого матча возвращает элемент из массива $vars с индексом согласованного значения-1. так что если (\d) матчей 1 вернет $vars[1-1]

+0

Я не понимаю, почему, но теперь он работает, мне просто нужно удалить $ v *, если они в объявлении пусто nks! – Sydowh

+0

добавлен небольшое объяснение. – bansi

+0

Отличная благодарность – Sydowh

0

заменить HTML с

<p>Test test test %s %s %s</p> 

тогда вы просто должны

echo vsprintf($string, [$v1, $v2, $v3]); 
+0

Я не могу, потому что это html, импортированный из БД :) – Sydowh