Проверьте, заканчивается ли путь к каталогу РАЗДЕЛИТЕЛЕМ КАТАЛОГОВ


В PHP я получаю строку от пользователя для локального каталога файлов $path

Я хочу знать, включили ли они завершающую косую черту (/) или нет. Я бы хотел, чтобы это было кроссплатформенным, поэтому я хотел бы использовать константу PHP DIRECTORY_SEPARATOR

Мои неудачные попытки включают попытку выполнить preg_match, например

preg_match("/" . DIRECTORY_SEPARATOR . "$/", $path);

Я в основном просто хочу элегантный способ проверить, заканчивается ли строка на DIRECTORY_SEPARATOR.

Author: Shane Stillwell, 2010-08-03

5 answers

Чтобы исправить регулярное выражение:

preg_match("/" . preg_quote(DIRECTORY_SEPARATOR) . "$/", $path);

Но могут быть и более простые способы достижения вашей цели:

rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
 16
Author: mvds, 2010-08-03 14:14:41

Что плохого в простом substr($path,-1)==DIRECTORY_SEPARATOR ?

 1
Author: stillstanding, 2010-08-03 14:29:21

Тривиальным способом решения этой проблемы было бы использовать...

$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;

...что было бы намного эффективнее, чем регулярное выражение. Опять же, это не удастся, если DIRECTORY_SEPARATOR не является одним символом.

 0
Author: John Parker, 2010-08-03 14:17:52

Также можно использовать нотацию доступа к массиву

$endsInDS = $str[strlen($str)-1] === DIRECTORY_SEPARATOR;
 0
Author: Gordon, 2010-08-03 14:27:48

Я думаю, что в зависимости от платформы вы можете получить недопустимое регулярное выражение в первом аргументе.

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

ПРАВКА #1 Мне понравилось предложенное решение

$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false;

И чтобы решить эту проблему, я предлагаю:

$sepPresent = $path{strlen($path) - strlen(DIRECTORY_SEPARATOR)} === DIRECTORY_SEPARATOR ? true : false;
 -1
Author: Dave, 2010-08-03 14:33:16