#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я пытаюсь протестировать строку, которая является путем к файлу, с помощью регулярного выражения, и я хочу, чтобы проверка регулярного выражения возвращала значение true тогда и только тогда, когда символы перед именем файла (которые являются только буквенно-цифровыми символами) являются ./
или ./../
. Моя проблема в том, что если путь содержит каталог, такой как ./../../
, тест возвращает true, потому что каталог начинается с ./
.
Я полагаю, что если я проверю точное совпадение только для символов, которые появляются перед любыми буквенно-цифровыми символами, я могу устранить эту проблему, но я не знаю, как это сделать.
Код:
function validPath(path) {
if (!/^(./|./../)/.test(path)) {
path = "ERROR" //the path is not valid if ERROR is returned
}
return path; //the path is valid if the path is returned
}
Я ожидаю, что результат validPath('./../../index.html')
будет ERROR
, но результат ./../../index.html
Комментарии:
1. Являются ли буквенно-цифровые символы, с которых начинается имя файла, только ASCII?
2. @RayToal да, они
Ответ №1:
Если вы знаете, что все имена файлов начинаются с букв, цифр или подчеркивания ascii, вы можете расширить свое регулярное выражение, указав, что следующий символ после ./
или ./../
должен быть одним из начальных символов имени файла:
if (!/^(./|./../)w/.test(path)) {
Здесь w
означает [A-Za-z0-9_]
.
Если вы хотите принимать имена файлов, начинающиеся с точки, или буквы, отличные от ASCII, вам придется проделать больше работы.
Регулярные выражения JavaScript изначально не обрабатывают буквы, отличные от ASCII, но вы можете использовать для этого сторонний движок регулярных выражений.
Другой подход заключается в том, чтобы сказать
if (!/^(./|./../)[^.]/.test(path)) {
это означает, что вы не хотите, чтобы первым символом после ./
или ./../
была еще одна точка. Это будет обрабатывать имена файлов с не-ASCII буквами, но не будет обнаруживать скрытые файлы, которые начинаются с точки.
Надеюсь, это поможет вам приблизиться!