Domanda

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

L'output che voglio è example.com/folder ma tutto ciò che ottengo ora è example.com..folder

So che è perché non ho il modello regex corretto, ma quale sarebbe quel modello?

È stato utile?

Soluzione

Modifica l'ordine dei modelli '/ - /' e '/ - /' in modo che '/ - /' viene prima controllato, altrimenti '/ - /' vincerà '/ - /' . Non interpolare gli array nella chiamata a preg_replace .

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

Alternative:

  • Utilizzare più chiamate per preg_replace nell'ordine in cui si desidera valutare le RE. Questo non è discutibile come potresti pensare perché preg_replace passa in rassegna gli array e gestisce ogni RE a sua volta.
  • Usa un sostituto valutato

    $url = "www-example-com--folder";
    $replacements = array('-' => '.', '--' => '/');
    $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
    
  • Usa un lookahead e lookbehind

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

Altri suggerimenti

Questo è PHP, giusto?

È necessario un quantificatore per specificare che si desidera esattamente due trattini nel secondo modello. Prova:

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

Le parentesi graffe dicono 'richiedono esattamente n del modello precedente'

Ecco un un buon riferimento .

Verifica se funziona:

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

ciò che dice "corrisponde a qualsiasi - che non ha un trattino prima o dopo e lo sostituisce con un. " e " match double - con / " ;. ovviamente, puoi estenderlo per limitare la seconda corrispondenza a 2 trattini solo aggiungendo ([^ -]) da e viceversa. così com'è, " ----- " diventerà " // " ;, che potresti non voler.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top