Регулярное выражение, совпадающее с несколькими шаблонами - PullRequest
0 голосов
/ 22 октября 2009
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);

Я хочу получить вывод example.com/folder, но все, что я сейчас получаю, это example.com..folder

Я знаю, что это потому, что у меня нет правильного шаблона регулярных выражений, но каким будет этот шаблон?

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Измените порядок шаблонов '/--/' и '/-/', чтобы сначала проверять '/--/', в противном случае '/-/' превзойдет '/--/'. Не интерполируйте массивы в вызове на preg_replace.

$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);

Альтернативы:

  • Используйте несколько вызовов на preg_replace в том порядке, в котором вы хотите оценить RE. Это не так нежелательно, как вы думаете, потому что 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);
    
0 голосов
/ 22 октября 2009

Проверьте, работает ли это:

$url = "example-com--folder";
$searchArray = array('([^-])-([^-])','--');
$replaceArray = array('$1.$2','/');
$url = preg_replace("$searchArray", "$replaceArray", $url);

это говорит о том, что "соответствует любому - у которого нет тире до или после, и замените его на". и "соответствует двойному - с /". очевидно, вы можете расширить это, чтобы ограничить второе совпадение 2 штрихами, только добавив ([^ -]) в начале и в конце. как таковое, «-----» станет «//», чего вы можете не хотеть.

0 голосов
/ 22 октября 2009

Это PHP, верно?

Вам нужен квантификатор, чтобы указать, что вы хотите, чтобы во втором шаблоне было ровно два дефиса. Попробуйте:

$searchArray = array('/-/','/-{2}/');

В фигурных скобках написано «требуется ровно n предыдущего шаблона»

Вот хорошая ссылка .

...