Можно ли в функции preg_replace использовать оператор if или чем нибудь его заменить?
В коде ниже вроде все правильно, но в нем выводится оператор2 в не зависимо от условия указанного в if.
код:
<?php
/* Вариант 1 */
$html = '{if[1==1]}1==1{[or]}1!=1{[end]}';
$html = preg_replace("#\\{if\\[(.*?)==(.*?)\\]\\}(.*?)\\{\\[or\\]\\}(.*?)\\{\\[end\\]\\}#is", ("$1"=="$2"?"$3":"$4"), $html);
echo $html;
/* Результат: 1!=1 */
/* ========= */
/* Вариант 2 */
$htmlx = 'if(1==1){1==1}else{1!=1}';
$htmlx = preg_replace("#if\\((.*?)==(.*?)\\)\\{(.*?)\\}else\\{(.*?)\\}#is", ("$1"=="$2"?"$3":"$4"), $htmlx);
echo $htmlx;
/* Результат: 1!=1 */
?>
В чем ошибка и как ее исправить?
Спустя 1 час, 18 минут, 3 секунды (9.09.2010 - 17:49) DedMorozzz написал(а):
Чудно построил. (.*)==(.*) под это условие попадаёт такое:
Далее - условия поддерживаются. Но делаются через ссылки. Это вот так:
Где number - номер скобок.
asdsad=12Тут надо не так А вот так:
(.*)==(\\number)
Далее - условия поддерживаются. Но делаются через ссылки. Это вот так:
(some text)? ... (?(number) ....)
Где number - номер скобок.
Спустя 32 минуты, 4 секунды (9.09.2010 - 18:21) Schurik написал(а):
Цитата |
asdsad=12 |
А если надо будет написать RU==RU?
1==1 это просто пример, а суть скрыта тут ("$1"=="$2"?"$3":"$4").
Цитата |
(some text)? ... (?(number) ....) |
Что ты этим хотел сказать я не понял.
Спустя 5 минут, 26 секунд (9.09.2010 - 18:26) DedMorozzz написал(а):
Цитата |
а суть скрыта тут ("$1"=="$2"?"$3":"$4"). |
Там не будет проверок. Там идёт замена. Хочешь проверку и далее с полученным результатом работать - юзай preg_replace_callback()
Насчёт Ру==Ру: (.*)==(\\1) . Т.е. \\1 - то же самое, что и в 1й скобке.
Насчёт Ру==Ру: (.*)==(\\1) . Т.е. \\1 - то же самое, что и в 1й скобке.
Цитата |
Что ты этим хотел сказать я не понял |
(.*)?... (?(1).....) - то что после ?(1) - будешь выполняться лишь при том условии, если условие в 1й скобке было верным, т.е. вхождение найдено.
Спустя 30 минут, 9 секунд (9.09.2010 - 18:56) Schurik написал(а):
Все спасибо разобрался, preg_replace_callback помогла.
<?php
function test($a,$b,$c,$d){
if($a==$b){
$content = $c;
}else{
$content = $d;
}
return $content;
}
$htmlx = 'if(1==1){1==1}else{1!=1}';
$htmlx = preg_replace("#if\\((.*?)==(.*?)\\)\\{(.*?)\\}else\\{(.*?)\\}#ies", "test('$1','$2','$3','$4')", $htmlx);
echo $htmlx;
или еще проще
$htmlx = 'if(1==1){1==1}else{1!=1}<br>if(1==2){1==2}else{1!=2}<br>if(RU==RU){RU==RU}else{RU!=RU}<br>if(RU==UA){RU==UA}else{RU!=UA}';
$htmlx = preg_replace("#if\\((.*?)==(.*?)\\)\\{(.*?)\\}else\\{(.*?)\\}#ies", "('$1'=='$2'?'$3':'$4')", $htmlx);
echo $htmlx;
?>