Регулярное выражение для ни одного или одного слеша в строке - PullRequest
0 голосов
/ 06 марта 2012

У меня есть несколько URL-адресов, таких как:

dir-1
dir-1/dir-2
dir-1/dir-2/dir-3
dir-1/dir-2/dir-3/dir-[n]..and so on..

Мое текущее регулярное выражение (с PHP) выглядит следующим образом:

/^([[:lower:][:digit:]\-\/]+)$/

Таким образом, регулярное выражение соответствует всем URL-адресам.Но в моем случае мне нужна только первая и вторая версии, чтобы не было ни одного, или только один случай с косой чертой.

Я несколько раз пытался найти правильный путь, но безрезультатно.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы можете просто взорвать строку, используя косую черту в качестве разделителя -

$str = "dir-1/dir-2";    
$splitArr = explode('/',$str);
  • Если результирующий массив содержит более одного элемента, то присутствует косая черта.
  • Более двух элементов == более одной косой черты!
array (
  0 => 'dir-1',
  1 => 'dir-2',
)  

Как показывает ваш вопрос, вы не говорите о какой-либо старой строке переменной buy конкретноURL, обязательно удалите протокол http или https из начала строки:

Например: https://marvin.com/dir-1/dir-2

Возможно, вы можете использовать переменную $_SERVER[REQUEST_URI] - этовозвращает текущий URL относительно сайтов DOCUMENT ROOT.

То есть $_SERVER[REQUEST_URI] из https://marvin.com/dir-1/dir-2 будет:

/dir-1/dir-2 (знакомо?)

После explode() выможно также использовать array_shift() для удаления начального root slash и
HEY PRESTO! , которых вы избегали использовать регулярные выражения!

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.

2 голосов
/ 07 марта 2012

Просто сопоставьте этот набор символов (минус /), затем необязательный /, затем этот набор символов снова (необязательно).

/^([[:lower:][:digit:]-]+\/?[[:lower:][:digit:]-]*)$/
...