Espressione regolare corrispondente a più schemi
-
05-07-2019 - |
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?
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.