Expresión regular que coincide con múltiples patrones
-
05-07-2019 - |
Pregunta
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
La salida que quiero es example.com/folder
pero todo lo que obtengo ahora es example.com..folder
Sé que esto se debe a que no tengo el patrón de expresión regular adecuado, pero ¿cuál sería ese patrón?
Solución
Cambie el orden de los patrones '/ - /'
y '/ - /'
para que '/ - /'
se verifica primero, de lo contrario '/ - /'
prevalecerá sobre '/ - /'
. No interpole las matrices en la llamada a preg_replace
.
$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);
Alternativas:
- Use múltiples llamadas a
preg_replace
en el orden en que desea evaluar los RE. Esto no es tan objetable como podría pensar porquepreg_replace
recorre los conjuntos y maneja cada RE a su vez. -
Usar un reemplazo evaluado
$url = "www-example-com--folder"; $replacements = array('-' => '.', '--' => '/'); $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
-
Utilice un mirar hacia delante y mirar hacia atrás
$url = "www-example-com--folder"; $searchArray = array('/(?<!-)-(?!-)/', '/--/'); $replaceArray = array('.', '/'); $url = preg_replace($searchArray, $replaceArray, $url);
Otros consejos
Esto es PHP, ¿verdad?
Necesita un cuantificador para especificar que desea exactamente dos guiones en el segundo patrón. Prueba:
$searchArray = array('/-/','/-{2}/');
Las llaves dicen 'requieren exactamente n del patrón anterior'
Aquí hay una buena referencia .
Vea si esto funciona:
$url = "example-com--folder"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
lo que esto dice es "coincidir con cualquiera - que no tenga un guión antes o después y reemplazarlo con un. " y '' emparejar doble - con / ''. obviamente, puede extender esto para limitar la segunda coincidencia a 2 guiones solo agregando ([^ -]) al principio y al final. tal como es, `` ----- '' se convertirá en " // " ;, que es posible que no desee.