Desconocido modificador ‘/’ error en PHP

preg_replace('/http:///ftp:///', 'https://', $value); 

http:// y ftp:// inside $value debe reemplazarse por https://

Este código da error:

 preg_replace() [function.preg-replace]: Unknown modifier '/' 

¿Qué es una verdadera expresión regular para esta tarea?

Intenta usar un delimitador diferente, digamos # :

 preg_replace('#http://|ftp://#', 'https://', $value); 

o (menos recomendado) escape cada ocurrencia del delimitador en la expresión regular:

 preg_replace('/http:\/\/|ftp:\/\//', 'https://', $value); 

También está buscando el patrón http:///ftp:// que realmente no tiene mucho sentido, puede que quiera decir http://|ftp:// .

Puede acortar su expresión regular como:

 preg_replace('#(?:http|ftp)#', 'https', $value); 

Comprender el error: Unknown modifier '/'

En su expresión regular '/http:///ftp:///' , el primero / se considera como delimitador inicial y el / después de : se considera como el delimitador final. Ahora sabemos que podemos proporcionar un modificador a la expresión regular para alterar su comportamiento predeterminado. Algunos de esos modificadores son:

  • i : para hacer que la caja coincidente sea insensible
  • m : búsqueda multilínea

Pero lo que PHP ve después del delimitador de cierre es otro / y trata de interpretarlo como un modificador pero falla, lo que da como resultado el error.

preg_replace devuelve la cadena modificada.

 $value = 'http://foo.com'; $value = preg_replace('#http://|ftp://#', 'https://', $value); // $value is now https://foo.com 

Utilice otro carácter delimitador, como ‘#’, por ejemplo.

 preg_replace('#/http://|ftp://#', 'https://', $value); 

Y no confundas / y |

 preg_replace('!(http://|ftp://)!', 'https://', $value); 

Larga historia: Regexp necesita estar encerrado en delimitadores, y esos deben ser únicos dentro de la expresión regular completa. Si desea usar /, los restantes / -s dentro de la expresión regular deben escaparse. Sin embargo, esto hace que la syntax se vea un poco fea. Afortunadamente puede usar cualquier carácter como delimitador. ! funciona bien, al igual que otros personajes.

El rest de la expresión regular solo enumera dos opciones, cualquiera de las cuales se reemplazará con el segundo parámetro.

 preg_replace('|http:\/\/ftp:\/\/', 'https://|', $value); 

Use esto en su lugar:

 preg_replace('-(http|ftp)://-', 'https://', $value); 

O

 preg_replace('/(http|ftp):\/\//', 'https://', $value);