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?

¿Fue útil?

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 porque preg_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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top