2016-11-03 3 views
0

Я пишу PHP приложение, и у меня есть входная строка в видеЗамена строки, за исключением некоторых частей

Hello world. Hello [fbes_keep]world[/fbes_keep]. 

И новая строка в виде

Hallo welt. Hello. 

То, что я хочу его для входной строки, которые будут заменены на новую строку, за исключением части в [fbes_keep] тегов, поэтому выход

Hallo welt. Hello [fbes_keep]world[/fbes_keep]. 

Мой текущий подход включает использование finediff library, но переопределение кодов удаления для поиска тегов fbes. Я спросил a question об этом вчера, но я чувствую, что, возможно, столкнулся с проблемой XY. Есть ли лучший способ?

Edit:Gist, содержащий текущую (нефункциональные) код и реальный тестовый случай.

+0

Итак, вы хотите удалить любой контент между '[fbes_keep]' тегом? Могут ли быть изменены эти имена тегов или они постоянны? – Justinas

+0

@Justinas Я хочу, чтобы строка вывода была новой строкой, за исключением частей между тегами '[fbes_keep]', которые должны быть скопированы из старой строки (в моем примере «мир» сохранен, хотя это не в новой строке, потому что она находится в тегах '[fbes_keep]'. И да, имя тега остается прежним. –

+0

Используйте 'preg_replace (" /.* (\ [fbes_keep \]. *)/", $ NewStr." $ 1 ", $ str)' – Mohammad

ответ

0

Может быть, это не самый изящный способ, как я это сделал, но я проверил это, и это делает работу:

$expression = 'world'; 
$newExpression = 'welt'; 
$str = 'Hello world. Hello [fbes_keep]world[/fbes_keep]. Here are some other world, and [fbes_keep]other[/fbes_keep] word in fbes.'; 
$pattern = '/\[fbes_keep\].*?\[\/fbes_keep\]/i'; 
$fbKepps = []; 
preg_match_all($pattern, $str, $fbKepps); 
$others = preg_split($pattern, $str); 
$result = ''; 
$i = 0; 
foreach ($others as $other) { 
    $result .= preg_replace('/' . addslashes($expression) . '/', $newExpression, $other); 
    $i++; 
    if ($i < count($others)) { 
     $result .= $fbKepps[0][$i - 1]; 
    } 

} 
echo $result; 

ВЫВОД

Hello welt. Hello [fbes_keep]world[/fbes_keep]. Here are some other welt, and [fbes_keep]other[/fbes_keep] word in fbes. 

Мой Ideia состоит в том, чтобы разбить строку на [fbes_keep]...[/fbes_keep], но прежде, чем хранить их в массиве. Затем перебираю все остальное, изменить world к welt затем CONCAT следующего fbes_keep и так далее ...

Он держит все [fbes_keep]anything[/fbes_keep] и порог Есть несколько fbes_keep могут быть в строке с другими словами тоже.

+0

Дело в том, что это не так просто, как просто изменение «мира» на «ранение». В реальном мире входные данные представляют собой длинные строки, которые необходимо изменить во всей их полноте. См. Связанные тесты. –

+0

_ В реальном мире входы - это длинные строки_ И? В чем проблема. '$ expression' может быть длинной строкой, как' $ newExpression'. Я сделал то, что вы точно спросили. – vaso123

+0

Простите меня, я это плохо сформулировал. Я хочу сказать, что я не вижу разницы между '$ expression' и' $ str'. Ваш пример просто заменяет 'world' на' welt' всюду, кроме тегов 'fbes'. Мое использование не так просто, как одно слово. –

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