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);