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?

Foi útil?

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ços preg_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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top