Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка по маске (https://javascript.ru/forum/misc/85090-proverka-po-maske.html)

ureech 04.04.2023 08:26

Проверка по маске
 
Привет. Нужна помощь по регулярке. У меня есть location.pathname и мне надо сравнить его с маской такого вида
news/* или news/sub/* и тп. То есть если последний символ *, значит вместо неё могут быть [a-z], _,[0-9],.,-. Как это сказать системе?

рони 04.04.2023 09:20

ureech,
let reg = /news\/(sub\/)?[-a-z.0-9_]/;
let arr = ['news/-', 'news/sub/_','news/.','news/?'].map(e => reg.test(e));
alert(arr);

voraa 04.04.2023 09:28

Цитата:

Сообщение от ureech
[a-z], _,[0-9],.,-

Только один символ или последовательность?
Для последовательности так
/^news\/(sub\/)?[a-z_0-9.\-]+$/

ureech 04.04.2023 09:34

Нет. Изначальная строка не такая /news\/(sub\/)?[-a-z.0-9_]/, а такая [a-z]/* и нужно сказать, что #\*# это [-a-z.0-9_]

ureech 04.04.2023 09:38

И да * это последовательность [-a-z.0-9_]

ureech 04.04.2023 09:44

То есть маска такая news/*.
location.pathname = 'news/sub/index.html' или 'news/sub/' или ...
И нужно что бы при сравнении'news/*' == location.pathname

рони 04.04.2023 09:49

ureech,
слишком много слов, не осилил)))

ureech 04.04.2023 09:52

Цитата:

Сообщение от рони (Сообщение 551382)
ureech,
слишком много слов, не осилил)))

:lol:

ureech 04.04.2023 09:53

Мне нужна регулярка, которая скажет, что

'#\*#' == '#[a-z_0-9.\-]+#';

рони 04.04.2023 10:01

ureech,
не понимаю, всё что мог, написал выше.

ureech 04.04.2023 10:04

Ок, спасибо

voraa 04.04.2023 10:39

Цитата:

Сообщение от ureech
То есть маска такая news/*.

Что бы начиналась с news/ а дальше что угодно?

ureech 04.04.2023 12:37

Есть массив
var arr = [ "news", "posts/*", "articles/statiy" ]

Это разрешённые маски адресов страниц над которыми можно выполнять определённые действия.
Я получаю адрес страницы. Например он
var adr =  'posts/index.html'

Перебираю arr и сравниваю c помощью регулярки
for(key in arr){
var rex = '' // вот тут нужна регулярка. И что бы в том числе 'posts/index.html' попадал в маску "posts/*"
if(adr.match(rex)){...}
}

ureech 04.04.2023 16:05

Решил на стороне сервера.

рони 04.04.2023 16:45

ureech,
const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
        const createRegExp = str => {
            str = str.split('*');
            str = str.map(e => escapeRegExp(e));
            str = str.join('[-a-z.0-9_]+');
            return new RegExp('^' + str + '$')
        };
        let arr = ["news", "posts/*", "articles/statiy"];
        arr = arr.map(createRegExp);
        let adr = 'posts/index.html';
        let test = arr.some(reg => reg.test(adr))
        alert([adr, test]);
        adr = 'posts/проверка.html';
        test = arr.some(reg => reg.test(adr));
        alert([adr, test])


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