Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Баланс символов 
V
    Опции темы
s1lver
Дата 5.12.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Подсобите с такой задачей:

Нужно выполнить проверку баланса скобок в текстовой области и если открывающейся скобке не соответствует закрывающаяся, то вывести ошибку во вторую текстовую область.  smile 


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Michael.de
Дата 6.12.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 2
Всего: 9



s1lver, каких скобок? Таких: ( ) или ещё [ ] и { } ?
Например так: есть стринг, с помощью charAt() считываем в цикле каждый знак и сравниваем его с открывающейся и закрывающейся скобками. Открывающая скобка - плюсуем 1 в переменную, закрывающая - минусуем. В конце смотришь: переменная не равна 0 (как и в начале) - ошибка.
Попробуй написать это сам, а мы поможем smile
PM MAIL   Вверх
Itsys
Дата 6.12.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 12
Всего: 34



А можно с помошью регулярки:
сначала ищем все нормальные
в цикле wile exec регулярку
Код

/^[^\(]+\(([^\)]+)\)[^\)]+$/

меняем тестируемую переменную на второй элемент возвращенного массива

а после проверяем наличие открывающей/закрывающей скобки
Код

/[\(\)]/


и если находим, выводим сообщение

ЗЫ если надо проверять не только (), то цикл запускается несколько раз.
PM MAIL WWW Skype   Вверх
s1lver
Дата 6.12.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Цитата

s1lver, каких скобок? Таких: ( ) или ещё [ ] и { } ?


Круглых вообще-то, про те я даже не подумал




Это сообщение отредактировал(а) s1lver - 6.12.2008, 11:30


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
s1lver
Дата 6.12.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Вот,тока чур сильно не ругать за глупость  smile 

Код


<script language="javascript" type="text/javascript" > 
function test()
{ i="("
  j=")"
 while (S.charAt())
{ form1.textarea.value=s(i+1, j+1)
 return {form1.textarea2.value}
 }
/* while (/^[^\(]+\(([^\)]+)\)[^\)]+$/) 
document.write("form1.textarea2.value");*/
}
</script>



--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
s1lver
Дата 6.12.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



 Не, наверное надо так сделать, поправьте где ошибусь:

Код


<script language="JavaScript"> 


function test(obj) 

{ var s=obj.textarea.value 

var res=l 

var ch=s.charAt(0)

if (!(ch>='(' && ch<=')')) res=0; 

if (res!=0)

{ for (var i=l; i <= s.length-1; i++) 

{ ch=s.charAt(i)

if (!(ch>='(' && ch<=')')) 

{res=0; break} 

} 

}

if (res==l) obj.textarea2.value="" 

else obj.textarea2.value="Ошибок нет" 

}

</script> 



--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Michael.de
Дата 6.12.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 2
Всего: 9



s1lver, вот как пример:
Код

<html>
<head>
<script type='text/javascript'>
function test(){
 var txt, len, i, tmp, error=0, message;
 txt=document.getElementById('text').value;
 message=document.getElementById('mess');
 len=txt.length;
 for (i=0; i<len; i++){
  tmp=txt.charAt(i);
  if (tmp=='(' || tmp==')') tmp=='(' ? error++ : error--;
 }
 if (error){
  message.style.color='red';
  message.value='Galakteko f opasnoste :/';
 }
 else {
  message.style.color='blue';
  message.value="It's Okay :)";
 }
}
</script>
<body>
<textarea id='text' style='width:300px;height:200px;border:1px solid #AAD;background-color:#EEF'>pischem tyta :)</textarea>
<button onclick='test();'>Click me</button><br>
<textarea id='mess' readonly='readonly' style='border:0;overflow:hidden;width:300px'></textarea>
</body>
</html>
Разберёшься? smile

Это сообщение отредактировал(а) Michael.de - 6.12.2008, 19:26
PM MAIL   Вверх
Itsys
Дата 7.12.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 12
Всего: 34



Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Проверка форм</title>
</head>
<body>
<span id="t1">(2+3)*5</span><br>
<span id="t2">(2+3)*5)</span><br>
<script type="text/javascript" language="JavaScript">
    var t1 = document.getElementById('t1').innerHTML;
    temp = /^.*\((.*)\).*$/.exec(t1);
    while (temp){
        t1 = temp[1];
        temp = /^.*\((.*)\).*$/.exec(t1);
    }
    if (/[\(\)]/g.test(t1)){
        document.write("первая строка неправильная<br>");
    }
    else{
        document.write("первая строка правильная<br>");
    }

    t1 = document.getElementById('t2').innerHTML;
    temp = /^.*\((.*)\).*$/.exec(t1);
    while (temp){
        t1 = temp[1];
        temp = /^.*\((.*)\).*$/.exec(t1);
    }
    if (/[\(\)]/g.test(t1)){
        document.write("вторая строка неправильная<br>");
    }
    else{
        document.write("вторая строка правильная<br>");
    }
</script>
</body>
</html>


PM MAIL WWW Skype   Вверх
ksnk
Дата 7.12.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Michael.de, )))))((((( - галактеко в полной безопасносте...

Itsys, (1+(2+3)*5)  - галактеко в опасносте...

Вот, написалось...
Код

function checkit(str){
  var stack=[],m,
      reg=/.*?([\(\[{\)\]}])/g; // недопарс
  while(m=reg.exec(str)){
    switch (m[1]){
      case '{':case '(':case '[':
         stack.push(m[1]);
         break;
      case '}':
         if('{'!=stack.pop())
            return 'нет открывающего {';
         break; 
      case ']':
         if('['!=stack.pop())
            return 'нет открывающего [';
         break; 
      case ')':
         if('('!=stack.pop())
            return 'нет открывающего (';
         break; 
    }
  }
   if(stack.length==0)
       return true;
    alert(stack);
    return 'Не закрыты скобки.';
}

var result=checkit('{1+(2+3)}*5');
if(result===true)
  alert('ok!');
else
  alert(result);


P.S. Где-то на PHP club'е видел регулярку рекурсивную для анализа вложенности скобок. Правда она для JS, imho, не будет работать...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
s1lver
Дата 7.12.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Цитата

Разберёшься? smile



Конечно smile 


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Michael.de
Дата 8.12.2008, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 2
Всего: 9



Цитата(ksnk @  7.12.2008,  12:21 Найти цитируемый пост)
Michael.de, )))))((((( - галактеко в полной безопасносте...
Так я и не спорю, просто в первом посте не написано, что это будет применяться для анализа мат. выражения. А алгоритм я знаю smile
P.S. Пару лет назад я написал (на яве) пару классов, которые получали строку типа sin(cos(x-2))+x^(x/2-Pi/4^(5-tan(sin(x-1)))) ... и т.п. , анализировали на мат. корректность записи и считали (при зад. х) значение выражения. Т.е. как бы JavaScript, но... без eval() smile
PM MAIL   Вверх
s1lver
Дата 8.12.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



А что сюда еще можно прикрутить? Так на всякий случай...


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.