Регулярное выражение, соответствующее нескольким шаблонам
-
05-07-2019 - |
Вопрос
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
Результат, который я хочу получить, это example.com/folder
но все, что я получаю сейчас, это example.com..folder
Я знаю, это потому, что у меня нет правильного шаблона регулярных выражений, но каким был бы этот шаблон?
Решение
Измените порядок следования '/--/'
и '/-/'
шаблоны , чтобы '/--/'
проверяется сначала, в противном случае '/-/'
будет ли трамп '/--/'
.Не интерполируйте массивы при вызове preg_replace
.
$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);
Альтернативы:
- Используйте несколько вызовов для
preg_replace
в том порядке, в каком вы хотите оценить REs.Это не так предосудительно, как вы могли бы подумать, потому чтоpreg_replace
перебирает массивы и обрабатывает каждый RE по очереди. Используйте проверенную замену
$url = "www-example-com--folder"; $replacements = array('-' => '.', '--' => '/'); $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
Используйте смотреть вперед и отстраняться
$url = "www-example-com--folder"; $searchArray = array('/(?<!-)-(?!-)/', '/--/'); $replaceArray = array('.', '/'); $url = preg_replace($searchArray, $replaceArray, $url);
Другие советы
Это PHP, верно?
Вам нужен квантификатор, чтобы указать, что вы хотите, чтобы во втором шаблоне было ровно два дефиса. Попробуйте:
$searchArray = array('/-/','/-{2}/');
В фигурных скобках написано «требуется ровно n от предыдущего шаблона»
Вот хорошая справка .
Посмотрите, работает ли это
$url = "example-com--folder"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
это говорит о том, что «соответствует любому», у которого нет или до или после тире, и замените его на. " и " совпадать с двойным - с / " ;. очевидно, вы можете расширить это, чтобы ограничить второе совпадение 2 штрихами, только добавив ([^ -]) в начале и в конце. как есть, "-----" станет " // " ;, чего вы, возможно, не хотите.