Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Простая регулярка (https://javascript.ru/forum/misc/54929-prostaya-regulyarka.html)

Andrei 07.04.2015 07:07

Простая регулярка
 
Здравствуйте!

Редко сталкиваюсь с регулярными выражениями и всегда это проблема для меня!(

Такой вот вопрос:

Пользователь должен ввести название бренда и в скобках страну, например: TOYOTA (Япония) или ВАЗ (Россия).

Помогите с регулярным выражением, как проверить верно ли введено значение!?

laimas 07.04.2015 07:54

Да их не так и много, производителей авто, удобнее не вводить, а предлагать выбор из списка.

Andrei 07.04.2015 07:59

У меня там ajax автокомплит, с полем удобно то, что всегда можно предложить свой вариант!

laimas 07.04.2015 08:07

И что, проверять это рег. выражениями. Как вы себе это представляете? Ведь при этом в паттерне нужно прописать все эти бренды, хотя можно сравнивать по наличию элемента в массиве, но который тоже должен быть описан. А если новое, предложенный вариант, то как узнать верный ли он, с чем его сравнивать?

Без обиды, но это называется маяться дурью. Для кого это и кто хранит эти бренды, ваш автокомплит или же все-таки сервер?

Andrei 07.04.2015 08:11

Мне нужно только чтобы пользователь правильно указал формат, "название (страна)", а проверять правильно ли он написал или "sdfsdfsf (addasda)" не нужно!

laimas 07.04.2015 08:15

Каким образом? Я напишу STRING (Тобаго) - это будет правильно?

PS. Проверить наличие () и пробелов в строке рег. выражением не проблема, но зачем, и не проще ли добавление нового это бренд и страна как отдельные поля? Если это ради помещения такого в базе, значит данные о брендах в базе имеют не лучшее отображение, а наихудшее.

ksa 07.04.2015 08:19

Цитата:

Сообщение от Andrei
Помогите с регулярным выражением, как проверить верно ли введено значение!?

Размером оно будет немалым... :D

Как вариант...
var str='TOYOTA (Япония)';
alert(ok(str));
str='NISSAN (Япония)';
alert(ok(str));
str='ВАЗ (Россия)';
alert(ok(str));
str='УАЗ (Россия)';
alert(ok(str));
function ok(Str) {
	var re=/^(((TOYOTA|NISSAN)\s\(Япония\))|((ВАЗ|УАЗ)\s\(Россия\)))$/;
	return re.test(Str);
};

ksa 07.04.2015 08:23

Цитата:

Сообщение от Andrei
Мне нужно только чтобы пользователь правильно указал формат, "название (страна)"

Как вариант...

var str='TOYOTA (Япония)';
alert(ok(str));
str='NISSAN (Япония)';
alert(ok(str));
str='ВАЗ (Россия)';
alert(ok(str));
str='УАЗ (Россия)';
alert(ok(str));
function ok(Str) {
	var re=/^.+\s\(.+\)$/;
	return re.test(Str);
};

laimas 07.04.2015 08:27

var re=/^.+\s\(.+\)$/;

Не пойдет такое, тогда брендом и страной может быть все, что угодно, хотя бы уж буковки одни, и то куда ни шло. )

Andrei 07.04.2015 08:29

Ладно уговорили!) Нашел список производителей, забью его в бд и сделаю select!

Спасибо!

laimas 07.04.2015 08:32

Уговорил... :) Это так обязательно нужно делать, без уговоров, и бред, и страна, это разные поля SQL таблицы, ни коем случае как БРЕНД (Страна)! И каждая запись, это уникальный идентификатор!

ksa 07.04.2015 08:33

Цитата:

Сообщение от laimas
Не пойдет такое

Сделай другое... :D

laimas 07.04.2015 08:35

>Сделай другое...

Зачем? Ну нельзя так поступать с данными, это хуже "костыля" в JS. )

ksa 07.04.2015 08:35

Цитата:

Сообщение от laimas
Зачем?

Тогда чего ко мне пристал? :D

laimas 07.04.2015 08:41

Для понту :lol:

theKingOfJava 07.04.2015 09:20

если иномарки вводяться только на латинице, то можно так
<html>
<head>
<meta charset="windows-1251" />

</head>
<body>


<input id="brand" />
<input id="country" />
<button id="b">купить</button>

<script>

b.onclick=function(){
 /^\w+$/.test(brand.value)&&/^россия$/i.test(country.value) ? alert("no") : alert("ok")
}

</script>

</body>
</html>

Иначе, придется составлять таблицу.

laimas 07.04.2015 09:22

Мужики, не надо никаких рег, а таблица (только не одна а две со связью по третьей внешней) должна быть SQL.

ksa 07.04.2015 09:35

Цитата:

Сообщение от laimas
а таблица (только не одна а две со связью по третьей внешней)

Три таблицы? :blink:

Сойдет и так


laimas 07.04.2015 09:36

Не сойдет, подумай, почему? ;)

ksa 07.04.2015 09:41

laimas, ты у нас мыслитель, т.ч. начинай рассказывать... :D

laimas 07.04.2015 09:45

А что рассказывать, если бы эти таблицы существовали сами по себе, тогда да, претензий нет, но ведь на эти таблицы будут ссылаться записи, в которых и описаны бренды/страны, и это могут быть отношения как многие к одному. Вот чтобы связать эти отношения таблицы записей с таблицами Бред<->Страна и нужна внешняя таблица связей между ними. :)

ksa 07.04.2015 10:01

Цитата:

Сообщение от laimas
Вот чтобы связать эти отношения таблицы записей с таблицами Бред<->Страна и нужна внешняя таблица связей между ними.

Я тебе на схеме показал как делается эта связь. Две таблицы и они между собой связаны.

laimas 07.04.2015 10:07

А я, как Диоген из бочки :), предлагаю сделать выборку записей в которых есть бренды А, Б и В, и/или страны А, Г и М.

ksa 07.04.2015 10:16

Цитата:

Сообщение от laimas
предлагаю сделать выборку записей в которых есть бренды А, Б и В, и/или страны А, Г и М

Все это осуществимо. :yes:
Третья таблица будет нужна если данные в полях "Название" лишаться уникальности в пределах своих таблиц, чего у Тса и не предвидеться...

Если это не так - пусть он об этом напишет. :)

laimas 07.04.2015 10:18

Бесспорно, но вопрос в том какой кровью это осуществляется. ;)
А если я упрощу условие и предложу вам сделать выборку только по стране/странам? В этом случае выборка с вашим представлением данных станет проще или нет?

ksa 07.04.2015 10:23

Цитата:

Сообщение от laimas
А если я упрощу условие, и предложу вам сделать выборку только по стране/странам? В этом случае выборка с вашим представлением данных станет проще или нет?

Будет нечто такое

Select
   *
From
   таблица_брендов
Where
   Код_страны IN(
       Select id From таблица_стран Where Название_страны IN('страна1','страна2', ...)
   )

ksa 07.04.2015 10:23

Повторюсь...
Цитата:

Сообщение от ksa
Третья таблица будет нужна если данные в полях "Название" лишаться уникальности в пределах своих таблиц, чего у Тса и не предвидеться...

Если это не так - пусть он об этом напишет.


laimas 07.04.2015 10:31

Select
*
From
таблица_брендов
Where
Код_страны IN(
Select id From таблица_стран Where Название_страны IN('страна1','страна2', ...)
)

Не пойдет, это выборка из таблицы брендов, а не из таблицы ссылающейся на указанные страны.

В том то и проблема - как выгоднее построить связи, а это да, зависит от задач работающих с ними.

ksa 07.04.2015 11:03

Цитата:

Сообщение от laimas
это выборка из таблицы брендов, а не из таблицы ссылающейся на указанные страны

Ты определись что тебе нужно показать в итоге... :D

ksa 07.04.2015 11:16

SELECT
	*
FROM
	table_brand as br
	LEFT JOIN table_country AS cn ON cn.id=br.codeCountry

laimas, далее делай любые условия... Указывай любую последовательность столбцов...

laimas 07.04.2015 11:28

Не надо мне рассказывать о JOIN :)
Это совсем не тот запрос, о котором я говорил. Вы постоянно имеете в виду некую базу исключительно о странах и брендах. Если так, то ваших таблиц и запросов достаточно. На практике же все гораздо сложнее, и очередной ваш запрос совсем не о том, что я имел ввиду.

ksa 07.04.2015 11:31

Цитата:

Сообщение от laimas
На практике же все гораздо сложнее

Где, те сложные практические примеры? :) Их пока нет...

ksa 07.04.2015 11:31

Цитата:

Сообщение от laimas
и очередной ваш запрос совсем не о том, что я имел ввиду.

Примеры, примеры и еще раз примеры?

laimas 07.04.2015 11:39

Пример, да пожалуйста. Есть СТО или магазины авто, которые могут обслуживать/продавать различные модели авто. С вашими двумя таблицами уже никак, нужна внешняя таблица связей. А если она есть, нафига же я буду связывать бренды со странами так как у вас? Это просто не выгодно.

ksa 07.04.2015 11:57

Цитата:

Сообщение от laimas
Есть СТО или магазины авто

У ТСа не такая задача. :nono:
Смело предположу, что у него нет ВАЗов (иже сними) из другой страны, кроме "Россия", равно как и нет TOYOTA (иже сними) кроме как из "Япония"...

Напоминаю так же, что все мои примеры сделаны не для какой-то абстрактной, сложной, жизненной задачи, а для ТСа онли... :)

Т.ч. либо примеры по проблеме ТСа... Либо все бесполезная переписка...

laimas 07.04.2015 12:06

Что у него я не знаю, сказать не могу. Вы совсем не поняли. СТО может обслуживать к пример ВАЗ, Тойета, Мазда, а то что первое никак не принадлежит Японии, так это и ежу известно. Вот только связать с вашими таблицами эти модели с СТО никак не получится без внешней таблицы связей.


Часовой пояс GMT +3, время: 08:09.