Просмотр полной версии : exec. РегВыр. Не хотят работать вместе.
Доброго времени суток, очень надеюсь на вашу помощь. Есть код:
$score = $("#score_sel option:selected").text();
$n_score = ( /\((\d+)\)/.exec($score))[1];
$drakes = $("#drakes_sel option:selected").text();
$n_drakes = ( /\((\d+)\)/.exec($drakes))[1];
В обоих случаях, есть некая переменная типа name_ (int)
Нужно достать эти int и далее их обрабатывать (считать). Суть в том, что отдельно $n_score и $n_drakes выводятся (когда второй закомменчен). Как только я добавляю второй, сразу все перестают работать. Таких переменных у меня больше 2х. Не могу понять в чем проблема, где конфликт. Подскажите, кто сталкивался, спасибо =)
Для извлечения из строки name_ (int) достаточно шаблона /\d+/
$score = +$("#score_sel option:selected").text().match(/\d+/)
Странно почему текст опции, а не ее значение?
Для извлечения из строки name_ (int) достаточно шаблона /\d+/
$score = +$("#score_sel option:selected").text().match(/\d+/)
Странно почему текст опции, а не ее значение?
Пользователь выбирает из нескольких селектов и весь выбор сразу дублируется в поле. В некоторых селектах в name могут попадаться числа, поэтому выбор еще и по скобкам.
Если в неком тексте опций необходимо выбирать цифры, то почему нельзя эти цифровые значения сразу определить в качестве их значений?
Если в неком тексте опций необходимо выбирать цифры, то почему нельзя эти цифровые значения сразу определить в качестве их значений?
Представь, что есть N бд. Овощи, цвета, страна и тд. Есть n селектов. Названия опций складываются из ячеек этих баз данных.
Опция1 Красный помидор Болгария (20)
Опция2 Синий мандарин Уругвай (100)
и тд. Бывают такие случаи, что попадаются
Опция N Серобурмал123иновый Карт0фель (45)
Пользователь выбирает и по ходу выбора, в поле ниже добавляются значения 20 +100 + 45.
Так сложились звезды, что я как начинающий в этом деле, реализовал эту штуку именно так. Теперь нужно выцепить из текста эти значения. Поэтому для каждого селекта нужно прописать этот .exec . Для одного случая, все хорошо. Как только я добавляю второй, работа прекращается. В описании exec я не нашел ничего запрещающего. Поэтому обратился сюда.
$score = +$("#score_sel option:selected").text().match( /\((\d+)\)/);
$drakes = +$("#drakes_sel option:selected").text().match( /\((\d+)\)/);
Такой способ выводит все значения, но, к сожалению, не определяет "NaN", как будто неверно регулярное выражение.
Хотя, получить надо число именно в скобках (5). Других скобок нигде нет
Тут не представлять надо, а думать. Если складываются цены, то почему эти цены прячутся в строки, откуда их выковыривать надо?
В БД данные хранят в структурированном виде, то есть имя Серобурмал123иновый, цена 45, идентификатор этой характеристики 5. Следовательно, если выбор опции отправляется на сервер, то выгоднее в value опции помещать идентификатор. Цену при этом можно поместить в атрибут, например, data-ptice="45".
Обходом в цикле всех списков получить цену из data-ptice и суммировать. Все.
Тут не представлять надо, а думать. Если складываются цены, то почему эти цены прячутся в строки, откуда их выковыривать надо?
В БД данные хранят в структурированном виде, то есть имя Серобурмал123иновый, цена 45, идентификатор этой характеристики 5. Следовательно, если выбор опции отправляется на сервер, то выгоднее в value опции помещать идентификатор. Цену при этом можно поместить в атрибут, например, data-ptice="45".
Обходом в цикле всех списков получить цену из data-ptice и суммировать. Все.
Ну, нельзя не согласиться, с такой логикой, но проблема не в структуре бд, а в том, что названия могут содержать в себе цифры. Безусловно, удобно такие параметры как цены прописывать отдельно в value или еще куда-либо, но в таком случае, эту цену надо выводить отдельно в текст, отдельно в value, что угромождает html до невозможности. Селектов тоже немало, поэтому для каждого делать свой запрос в БД, можно, конечно.. но как мне кажется проще выцепить необходимое и все. Убрать лишнее из выбора - 1 строчка на 1 селект, запрос в бд, 2-3 строчки на 1 селект. Плюс ко всему этому, value далее уходят через POST. Вывод POST на текущую страницу без перезагрузки выдает ошибку, которую решить, как мне кажется, еще сложней. Там идет конфликт с подключаемым скриптом.
Ну, нельзя не согласиться, с такой логикой, но проблема не в структуре бд, а в том, что названия могут содержать в себе цифры.
Проблема как раз в БД, если в ней то, что вы стараетесь выковырять из строки, не содержится значением в отдельном поле SQL таблицы. А если оно отдельное, то причем тут цифры в названиях?
но в таком случае, эту цену надо выводить отдельно в текст, отдельно в value, что угромождает html до невозможности.
Полнейшая глупость. Хорошо структурированные данные в базе, как раз нужны для облегчения работы с ними. Тоже самое должно быть и на html-страницах - удобное представление этих данных, а не вгонять с строку и разбираться посредством RegEXP. Там где без RegEXP можно обойтись, RegEXP зло.
<option value="10" data-price="45">Картофель сорт А12, цена 45 руб.</option>
Есть проблемы здесь с описанием товара и отдельным значением его цены?
Проблема как раз в БД, если в ней то, что вы стараетесь выковырять из строки, не содержится значением в отдельном поле SQL таблицы. А если оно отдельное, то причем тут цифры в названиях?
Полнейшая глупость. Хорошо структурированные данные в базе, как раз нужны для облегчения работы с ними. Тоже самое должно быть и на html-страницах - удобное представление этих данных, а не вгонять с строку и разбираться посредством RegEXP. Там где без RegEXP можно обойтись, RegEXP зло.
<option value="10" data-price="45">Картофель сорт А12, цена 45 руб.</option>
Есть проблемы здесь с описанием товара и отдельным значением его цены?
<option value="1" > <?php print ($item1. ' (' .$score[0]['cost'].')'); ?> </option>
<option value="1" > 0 - 2 (<?php echo($drake[0]['cost']); ?>) </option>
Так выглядят варианты 1 и 1 двух селектов. Нужно выцепить $score[0]['cost'] и $drake[0]['cost'].
Они содержат то, что нужно, в нужно int виде. Перед селектом подключен скрипт с запросом в БД. Чтобы вывести, как вы говорите, нужно еще и после селекта делать отдельный запрос с фильтром по выбранному value, для каждого селекта, чтобы выцепить 'cost'..
Проблема в том, что название селекта генерируется из БД =)
Так выглядят варианты 1 и 1 двух селектов.
Весьма жаль и очень плохо, что данные, с которыми нужно работать, у вас так выглядят.
Они содержат то, что нужно, в нужно int виде.
Они содержат нужное, но совсем не так, как это следовало бы делать.
Чтобы вывести, как вы говорите, нужно еще и после селекта делать отдельный запрос с фильтром по выбранному value, для каждого селекта, чтобы выцепить 'cost'
Во-первых я не знаю структуры ваших данных, а во-вторых, получить основные данные и данные дополнительные чего-то, это совсем не означает, что нужно делать кучу отдельных запросов к БД. Не надо мне лапшу на уши вешать, я хорошо знаю, что такое БД и как с ней нужно работать. :)
И да - все что содержится в полях формы, это не INT, это строки.
Весьма жаль и очень плохо, что данные, с которыми нужно работать, у вас так выглядят.
Они содержат нужное, но совсем не так, как это следовало бы делать.
Во-первых я не знаю структуры ваших данных, а во-вторых, получить основные данные и данные дополнительные чего-то, это совсем не означает, что нужно делать кучу отдельных запросов к БД. Не надо мне лапшу на уши вешать, я хорошо знаю, что такое БД и как с ней нужно работать. :)
Так я сюда и не учить кого-то пришел, а учиться.. По сути, это чуть ли не первый проект. И так уж сложилось, что данные выходят именно так. Может быть, настанет время, и я образумлюсь и все перепишу "как надо", а не черти-как, но пока нужно решить конкретную задачу, а скрипт выводит NaN :-?
получить основные данные и данные дополнительные чего-то, это совсем не означает, что нужно делать кучу отдельных запросов к БД
Предполагаю что тут ситуация при которой frontend разработчк не имеет доступа к backend части. Результат - необходимость извращаться с регулярками.
Предполагаю что тут ситуация при которой frontend разработчк не имеет доступа к backend части
А это как объяснить - <option value="1" > <?php print ($item1. ' (' .$score[0]['cost'].')'); ?> </option> ?
laimas,
Ему дали код, но не разрешили править, чтобы ничего ВНЕЗАПНО не сломал :haha:
Так я сюда и не учить кого-то пришел, а учиться
Так а я о чем? Учится, значит учится грамотно проектировать БД, а это 99% успешного веб приложения. Будет понимание того, как оптимально хранить данные в БД, придет и понимание того, как можно оптимально эти данные и на странице представлять.
Вы по сути сделали следующее (пусть считаем, что с базой все ОК) - взяли и сознательно все смешали в кучу, а затем костылями пытаетесь выудить в ней нужное.
Вот вы можете ответить на вопрос - почему ваши две опции имеют value="1". Что такое 1?
PS. NaN, потому что, как я уже говорил, value="1" не есть число, это строка в которой 1 написано. То же самое и с возвратом по шаблону - вернется не число, а строка. Чтобы она стало числом нужно parseInt() (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
И да, вернитесь к серверной стороне. К чему "нужно еще и после селекта делать отдельный запрос с фильтром по выбранному value" не понятно, а я говорю о грамотном представлении данных на клиенте.
<option value="1" data-price="<?=$score[0]['cost']?>"> <?=$item1 . ' (' . $score[0]['cost'] . ')'?> </option>
Так разве есть проблемы с выводом?
Вот вы можете ответить на вопрос - почему ваши две опции имеют value="1". Что такое 1?
Потому что это два value от двух разных селектов. По сути, номер это выбора в селекте. 1...n
PS. NaN, потому что, как я уже говорил, value="1" не есть число, это строка в которой 1 написано. То же самое и с возвратом по шаблону - вернется не число, а строка. Чтобы она стало числом нужно parseInt() (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
Я применяю .match не к value, а к text. И пусть бы эти 1, 20, 100500 будут строками, а не числами. Мне их записать надо.
И да, вернитесь к серверной стороне. К чему "нужно еще и после селекта делать отдельный запрос с фильтром по выбранному value" не понятно, а я говорю о грамотном представлении данных на клиенте.
<option value="1" data-price="<?=$score[0]['cost']?>"> <?=$item1 . ' (' . $score[0]['cost'] . ')'?> </option>
Так разве есть проблемы с выводом?
Вероятно, так тоже сработает. Но сейчас на странице около 17 опций на 5 селектов. Будет больше. В каждом отдельно прописывать data-price="<?=$score[0]['cost']?>"
будет оптимальней рег.выражений?
Потому что это два value от двух разных селектов. По сути, номер это выбора в селекте. 1...n
А выбор пользователя ведь нужен не ему, а серверу, так ведь? А чем должен оперировать сервер? Уж точно не результатом на на клиенте, как 20+30+.... Сервер должен ведать ценами, он должен считать сам, а для этого он должен получать в качестве value полей формы не абстрактные 1, 2, 3, .... а идентификаторы товара, либо его характеристик, либо иное, но то, что определяется уникальным значением этого в базе. Всякие расчеты на клиенте, это сугубо сервис для пользователя, тем более когда речь идет о деньгах.
И пусть бы эти 1, 20, 100500 будут строками, а не числами.
Нельзя сложить строки, результатом будет строка, либо NaN.
будет оптимальней рег.выражений?
Да.
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot