expressão regular padrões múltiplas correspondência
-
05-07-2019 - |
Pergunta
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
A saída que eu quero é example.com/folder
mas tudo que eu vejo agora é example.com..folder
Eu sei que isso é porque eu não tenho o padrão regex adequada, mas o que esse padrão ser?
Solução
Alterar a ordem dos padrões '/--/'
e '/-/'
para que '/--/'
é verificado primeiro, caso contrário '/-/'
'/--/'
vontade trunfo. Não interpolar as matrizes na chamada para preg_replace
.
$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);
Alternativas:
- Usar várias chamadas para
preg_replace
na ordem que você deseja avaliar os REs. Isto não é tão desagradável como se poderia pensar, porque laçospreg_replace
sobre as matrizes e alças de cada RE, por sua vez. -
Use um substituto avaliadas
$url = "www-example-com--folder"; $replacements = array('-' => '.', '--' => '/'); $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
-
Use a lookahead e lookbehind
$url = "www-example-com--folder"; $searchArray = array('/(?<!-)-(?!-)/', '/--/'); $replaceArray = array('.', '/'); $url = preg_replace($searchArray, $replaceArray, $url);
Outras dicas
Esta é PHP, certo?
Você precisa de um quantificador para especificar que você quer exatamente dois hífens no segundo padrão. Tente:
$searchArray = array('/-/','/-{2}/');
As chaves dizer 'exigem exatamente n do padrão anterior'
Aqui está um boa referência .
Veja se isso funciona:
$url = "example-com--folder"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
O que isso diz é "combinar com qualquer - que não tem um traço antes ou depois e substituir isso com um." e "coincidir com duplo - com /". Obviamente, você pode estender isso para limitar o segundo jogo para 2 traços apenas pela adição de ([^ -]) na ida e volta. como é, "-----" se tornará "//", que você pode não querer.