[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Замена символов с условиями
motorway
Помогите решить следующую задачу:

Нужно заменить в строке все запятые на точки, которые находятся не внутри квадратных скобок [].
5,6+max(6,5;4,5)+[20,40] -> 5.6+max(6.5;4.5)+[20,40]

Также нужно заменить в строке все точки с запятой на запятую, если они находятся внутри круглых скобок ().
То есть если этот символ окружен скобками.

Очень нужно!



Спустя 53 минуты, 42 секунды (17.07.2009 - 18:38) glock18 написал(а):
Пожалуйста, вот:

PHP
function MathReplace($string)
{
    
// Разбиваем по квадратным скобкам
    
$array preg_split('/[\[\]]/'$string);
    
    
// У четных элементов заменяем , на . Четные элементы не внутри квадратных скобок
    // Ограничение: квадратные скобки не могут быть вложены друг в друга, как [[]]
    
$count count($array);
    for (
$i 0$i $count$i+=2
    {
        
$array[$i] = str_replace(',''.'$array[$i]);
    }

    
// Склеиваем строки обратно
    
$string $array[0];
    for (
$i 1$i $count$i++)
    {
        
$string .= (($i '[' ']') . $array[$i]);
    }
    
    
// У полученной строки заменяем все ; на , если ; внутри круглых скобок.
    // Цикл нужен для того, чтобы заменить все ; если их больше 1 внутри одних скобок.
    
do
    {
        
$temp $string;
        
$string preg_replace('/(\([^;\)]+);(.+?\))/''$1,$2'$string);
    }while(
$temp != $string);
    
    return 
$string;
}
    echo 
MathReplace('5,6+max(6,5;4,5)+[20,40]') . '<br />';
    echo 
MathReplace('5,6+max(6,5;4,5)+[20,40]+[20,40]') . '<br />';
    echo 
MathReplace('5,6+max(6,5;4,5;2,5)+[20,40]+[20,40]+5,6') . '<br />';


все действия закомментированы.

Спустя 49 минут, 54 секунды (17.07.2009 - 19:28) FatCat написал(а):
Если парность скобок соблюдена, то довольно просто.
PHP
function replace($txt){
    
$pos 0;
    
$if_1 FALSE;
    
$if_2 FALSE;
    
$return "";
    while(
$pos<strlen($txt))
    {
        
$symbol substr($txt,$pos,1);
        if(
$symbol=="[")$if_1 TRUE;
        if(
$symbol=="]")$if_1 FALSE;
        if(
$symbol=="(")$if_2 TRUE;
        if(
$symbol==")")$if_2 FALSE;
        
        
// Нужно заменить в строке все запятые на точки, которые находятся не внутри квадратных скобок
        
if(!$if_1 and $symbol==",")$symbol=".";
        
        
// нужно заменить в строке все точки с запятой на запятую, если они находятся внутри круглых скобок
        
if($if_2 and $symbol==";")$symbol=",";
        
        
$return .= $symbol;
        
$pos++;
    }
    return 
$return;
}

Спустя 3 минуты, 32 секунды (17.07.2009 - 19:31) FatCat написал(а):
glock18
Я с похожей задачей неделю промаялся. Не с самой задачей, а с наименее ресурсоемким алгоритмом ее решения. Тут отчет.

Спустя 3 часа, 43 минуты (17.07.2009 - 23:14) motorway написал(а):
Спасибо, мне еще на одном форуме помогли, там тоже не очень большой код.
Решение похоже на решение FatCat

Спустя 30 минут, 55 секунд (17.07.2009 - 23:45) motorway написал(а):
Нет, все-таки они мне дали плохой код! Если скобок внутри несколько, не получается!!!

Мне нужен код, работающий даже со вложенными скобками

Спустя 2 минуты, 54 секунды (17.07.2009 - 23:48) glock18 написал(а):
А, ну да. можно посимвольно, конечно. Я как-то отвык от такой обработки строк уже rolleyes.gif

substr($str, $pos, 1)
можно и следует заменить на

$str{$pos}. быстрее и читается получше.

Спустя 4 минуты, 20 секунд (17.07.2009 - 23:52) motorway написал(а):
Не работает... Ничего не выводит sad.gif

Спустя 29 минут, 56 секунд (18.07.2009 - 00:22) glock18 написал(а):
Вот уж проблема.

Посимвольный проход позволяет сделать че хочешь. Просто надо на $if_1 и $if_2 поставить счетчики открытых скобок вместо true/false.

Спустя 2 минуты, 33 секунды (18.07.2009 - 00:25) glock18 написал(а):
Цитата (motorway @ 17.07.2009 - 20:45)
Мне нужен код, работающий даже со вложенными скобками

я решил сделать задачу, потому что она показалась интересной. теперь же вы не получите ни строчки кода, потому что с таким подходом вам нужно было создавать тему в "Заказы"/"Проекты".

Спустя 13 часов, 35 минут, 23 секунды (18.07.2009 - 14:00) motorway написал(а):
Я просто забыл об этом сначала написать, хотя это подразумевалось. Как раз со вложенными скобками она интересней biggrin.gif

Спустя 4 часа, 28 минут, 2 секунды (18.07.2009 - 18:28) FatCat написал(а):
Цитата (motorway @ 18.07.2009 - 00:45)
Мне нужен код, работающий даже со вложенными скобками

PHP
function replace($txt){
    
$pos 0;
    
$if_1 0;
    
$if_2 0;
    
$return "";
    while(
$pos<strlen($txt))
    {
        
$symbol substr($txt,$pos,1);
        if(
$symbol=="[")$if_1++;
        if(
$symbol=="]")$if_1--;
        if(
$symbol=="(")$if_2++;
        if(
$symbol==")")$if_2--;
        
        
// Нужно заменить в строке все запятые на точки, которые находятся не внутри квадратных скобок
        
if($if_1==and $symbol==",")$symbol=".";
        
        
// нужно заменить в строке все точки с запятой на запятую, если они находятся внутри круглых скобок
        
if($if_2>and $symbol==";")$symbol=",";
        
        
$return .= $symbol;
        
$pos++;
    }
    return 
$return;
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.