Скажите, что $ d - путь к каталогу, и я хочу, чтобы он начинался и заканчивался ровно одной косой чертой (/). Первоначально он может иметь ноль, одну или несколько ведущих и/или конечных косых черт.головоломка preg_replace: замена нуля или более символа в конце объекта
Я пробовал:
preg_replace('%^/*|/*$', '/', $d);
, который работает на слэш, но мои урожаи внезапных два слешей, если $ d имеет, по меньшей мере, один слэш. Если объектом является, например, 'foo///'
, то preg_replace() сначала соответствует и заменяет три конечных косая черта одной косой чертой, а затем соответствует нулевым сокращениям в конце и заменяет их косой чертой. (Вы можете проверить это, заменив второй аргумент '[$0]'
.) Я нахожу это довольно противоречивым.
Хотя есть много других способов решить лежащую в основе проблему (и я ее реализовал), это стало загадкой PCRE для меня: какой (скалярный) шаблон в одном preg_replace
выполняет эту работу?
ДОПОЛНИТЕЛЬНЫЙ ВОПРОС (редактировать)
Может кто-нибудь объяснить, почему этот шаблон совпадает так, как это делает в конце строки, но не ведет себя подобным образом в самом начале?
+1 приятное объяснение.Хотя для меня поведение двигателя регулярных выражений по-прежнему неинтуитивно. – NikiC
Прекрасная экспозиция. Спасибо, Алан. Хотя это имеет смысл, поскольку вы описываете это, я сомневаюсь, что смогу вспомнить это в следующий раз, когда что-то вроде этого появляется - противоречивая вещь. Но он здесь для справок в будущем. – 2010-08-06 20:27:20