[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулряка - разобрать
andrey888
День добрый. Прошу подсказать тех кто в теме

Есть следующая регулярка:
replace(/.(?![^.]*.)/m, "")
работает с текстом, вырезает ненужные символы.

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

Заранее благодарю.

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
walerus
Не совсем понятно какая "проблема" происходит

/ - экраны регулярки
. - любой символ
( - знак скобки
? - Знак вопроса -- ? -- означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. В основном используется для поиска одиночных символов
! - Восклицательный знак (!) в начале шарлиста(то что в квадратных скобках) означает, что совпадение выполнено, если любой символ, за исключением символов в шарлисте, находится в выражении. Если символ восклицательного знака используется без скобок, он сопоставляется с самим собой.
[^.] - все кроме точки
* - любой символ
) знак скобки
kaww
(?!ABC) - Negative lookahead. Указывает группу, которая не может совпадать после основного выражения (если она совпадает, результат отбрасывается).
[^.]* - Не '.' один или ноль раз
. - любой символ, кроме переноса строки.

В целом какая-то странная регулярка. Фактически попадает любой последний символ, т.о. replace(/.(?![^.]*.)/m, "") удаляет последний символ, что можно сделать проще в js.
andrey888
Спасибо за уточнения walerus и kaww !

Вот в том и дело. В админке одного проекта при загрузке нового документа беретеся его название И ВСЕГДА пропадает последний символ. не важно какой он.. ЧТО пытался сделать программер который это писал я могу только предположить , возможно избавиться от переноса строки. Может вы как понимающие регулярку сможете предположить более корректно что имелось ввиду..

1) В целом я так понимаю чтобы такого не происходило мне нужно убрать последнюю точку в скобках ? тогда символ не будет обрезаться. Может ли это как то повлиять на безопасность ? Занесение (по ошибке или намеренно) неправильных символов и т.д...

2) Если логика данной регулярки вам ясна - возможно сможете предложить эту же логику с другой регуляркой , если что воспользуюсь .

Заренее спасибо за разьяснения

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
walerus
andrey888
Не совсем понятна задача, для чего вообще там регулярка?, убрать перенос строки? удалить последний символ?...
Почему не str.trim() или $.trim() например использовать.

Знать бы весь путь переменной, от ее создания до конца использования.
andrey888
walerus

последний символ убирается в любом случае и он корректный.. то есть он убираться НЕ должен. именно по этой причине я попросил разобрать регулярку потому что это явно небольшой БАГ.

что конкретно делается в строке:

$("#modalAdd").find("div.modal-body").append(
'<div class="control-group"><div class="controls">' +
'<textarea
name="filemanager[' + $(this).data("id") + ']"
data-id="' + $(this).data("id") + '"
style="width:98%; height: 60px;"
>' + $(this).find("span.name").text().replace(/.(?![^.]*.)/m, "") +
'</textarea>'
+
'</div></div>'
);


Закачивается файл. Открывается модальное где выводится загруженный файл и его имя, которое можно изменить. Вот в процессе взятия имени файла и вывода его в модальное окно чтобы сохранить оно и пробегает через эту регулярку.

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

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



добавлю предположение:
Возможно человек хотел чтобы название файла которое записывается в БД четко соответствовало форме "имя файла . расширение" и при этом убирая переносы строки и пробелы в начале и конце.
Предположить будет легче именно человеку который ХОРОШО в регулярках шарит ) какой замысел тут был )

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
andrey888
walerus , kaww

Дак как сделать эту регулярку чтобы она не убирала последний символ ? или какой то аналог который будет выполнять ту же функцию как эта регулярка только без удаления символа в конце.. ?

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
kaww
Цитата (andrey888 @ 28.11.2022 - 13:49)
какой то аналог который будет выполнять ту же функцию как эта регулярка только без удаления символа в конце.. ?

Эта регулярка ничего больше не делает, только удаляет последний символ. Её аналог, который не убирает последний символ, - это ничего не делать.
andrey888
Цитата (kaww @ 29.11.2022 - 02:14)
Цитата (andrey888 @ 28.11.2022 - 13:49)
какой то аналог который будет выполнять ту же функцию как эта регулярка только без удаления символа в конце.. ?

Эта регулярка ничего больше не делает, только удаляет последний символ. Её аналог, который не убирает последний символ, - это ничего не делать.

то есть все эти символы в регулярке
replace(/.(?![^.]*.)/m, "")

только для того чтобы вырезать последний символ ? 0_о.

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

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
andrey888
Кажется дошло.. человек пытался убрать последний символ из строки потому что если в названии в конце была точка , то расширение файла потом неправильно принималось в системе.

вопрос такой , чтобы убрать точку в конце строки я так понимаю нужно сделать вот так
 /\.$/m 


а как сделать чтобы убиралась точка в конце строки и перенос строки тоже в конце

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
walerus
А что в этом блоке находится ?
$(this).find("span.name")

текст или же просто имя файла - приведи пример или скрин, а то так же не понятно, почему в textarea не воткнуть сразу то, что в "том" блоке, если там только имя файла например...

Да и я так понимаю это кусок шаблона какого то ты привел?

/\..*$/m 
удалить точку и все после нее до конца строки
Но может быть момент что файл называется my_file.name.txt - как тогда быть?
да и это как бы FRONTEND, может там не нужна такая строгая проверка имени?, на BackEnd можно проверить что за файл и его тип, например - mime_content_type() или finfo_file()
andrey888
Цитата (walerus @ 6.12.2022 - 13:49)
А что в этом блоке находится ?
$(this).find("span.name")

текст или же просто имя файла - приведи пример или скрин, а то так же не понятно, почему в textarea не воткнуть сразу то, что в "том" блоке, если там только имя файла например...

Да и я так понимаю это кусок шаблона какого то ты привел?

/\..*$/m 
удалить точку и все после нее до конца строки
Но может быть момент что файл называется my_file.name.txt - как тогда быть?
да и это как бы FRONTEND, может там не нужна такая строгая проверка имени?, на BackEnd можно проверить что за файл и его тип, например - mime_content_type() или finfo_file()

в этом блоке
$(this).find("span.name")

находится имя файла взятое с компа. любой файл docx например какой нить документ

пока что сделал костыльно но задачу (убрать в конце перенос строки и в конце точку) решил. вот так:
$(this).find("span.name").text().replace(/\.$/m, "").replace(/[\r?\n]/m, " ").trim()


уверен есть куча более красивых вариантов )

по поводу защиты на ФРОНТЕ согласен, основа в любом случае должна идти дальше. но конкретно это обработка делалась не мной и то что на БЭКЕНДЕ я еще не проверял. Но почему то зная того кто делал эту систему уверен что там с безопасностью все ОК )

главное было убрать этот баг который мешал многим жить при закачке файлов и нужно было дописывать последний символ постоянно в ручную .

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Быстрый ответ:

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