Регулярное выражение, соответствующее нескольким шаблонам

StackOverflow https://stackoverflow.com/questions/1604478

  •  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 штрихами, только добавив ([^ -]) в начале и в конце. как есть, "-----" станет " // " ;, чего вы, возможно, не хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top