Modificatore sconosciuto '/' errore in PHP

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

http:// e ftp:// all'interno $value deve essere sostituito con https://

Questo codice dà errore:

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

Cos'è una regex vera per questo task?

Prova a utilizzare un delimitatore diverso, ad esempio # :

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

o (less consigliato) sfuggire ad each occorrenza del delimitatore nella regex:

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

Inoltre stai cercando il pattern http:///ftp:// che in realtà non ha molto senso, potresti http://|ftp:// dire http://|ftp:// .

Puoi rendere la tua regex più breve come:

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

Capire l'errore: Unknown modifier '/'

Nella tua regex '/http:///ftp:///' , il primo / è considerato come delimitatore iniziale e / dopo il : è considerato come il delimitatore finale. Ora sappiamo che possiamo fornire un modificatore alla regex per modificare il suo comportmento predefinito. Alcuni di questi modificatori sono:

  • i : per rendere insensibile la distinzione tra maiuscole e minuscole
  • m : ricerca su più linee

Ma ciò che PHP vede dopo il delimitatore di chiusura è un altro / e tenta di interpretarlo come un modificatore ma fallisce, con conseguente errore.

preg_replace restituisce la string alterata.

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

Ad esempio, usa un altro carattere di delimitazione, come '#'.

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

E non confondere / e |

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

Lunga storia: Regexp deve essere racchiuso tra delimitatori e quelli devono essere unici all'interno dell'intera espressione regexp. Se vuoi usare /, allora i rimanenti / -s all'interno di regexp devono essere sfuggiti. Ciò tuttavia rende la syntax un po 'brutta. Fortunatamente puoi usare qualsiasi carattere come delimitatore. ! funziona bene, così come altri personaggi.

Il resto del regexp elenca solo due opzioni, che verranno sostituite con il secondo parametro.

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

Usa questo invece:

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

O

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