preg_replace_callback

Статус
В этой теме нельзя размещать новые ответы.

jami

Постоялец
Регистрация
10 Авг 2011
Сообщения
114
Реакции
40
PHP, есть задача:
заменить в документе все строки вида {a1|b2|c3|etc} на один из элементов разделенных "|" в скобках, хотелось бы сделать одним регекспом.
т.е. {a1|b2|c3|etc} -> убрать {} -> split '\|' -> rand
PHP:
$msg = file("msg.txt");
function rand_msg($msg) {
	$res_msg = "";
	foreach ($msg as $st) { 
		preg_replace_callback("|(\{[^\}]+\})|", 'rand_elem', $st);
		$res_msg = $res_msg . $st;
		//$sites=$sites[rand(0, count($sites) - 1)];
	}
	return $res_msg;
}
function rand_elem($m) {
	preg_replace("|\{|", ' ', $m[1]);
	preg_replace("|\}|", ' ', $m[1]);
	$sp = split('\|', $m[1]);
	
	$res = $sp[rand(0, count($sp)-1)];
	echo $res;
	return $res;
}
в этом коде rand_msg от $msg возвращает исходное $msg, без нужных подстановок.. хотя вроде все действия внешне похожи на правду.
Подскажите плз, что не так, буду весьма благодарен.
 
Код:
[B][COLOR="Blue"]$st = [/COLOR][/B]preg_replace_callback("|(\{[^\}]+\})|", 'rand_elem', $st);
У тебя рега обрабатывалась, но результат уходил в пустоту.
 
  • Нравится
Реакции: jami
и preg_replace тоже в пустоте теряется, там можно и str_replace использовать
PHP:
$msg = file("msg.txt");
echo rand_msg($msg);

function rand_msg($msg) {
    $res_msg = "";
    foreach ($msg as $st) {
        $st = preg_replace_callback("/({[^}]+})/i", 'rand_elem', $st);
        $res_msg = $res_msg . $st;
    }
    return $res_msg;
}
function rand_elem($m) {
    $m[1] = str_replace('{', '', $m[1]);
    $m[1] = str_replace('}', '', $m[1]);
    $sp = explode('|', $m[1]);
    $res = $sp[rand(0, count($sp)-1)];
    return $res;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху