Неизвестная ошибка модификатора '/' в PHP

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

http:// и ftp:// внутри $value следует заменить на https://

Этот код дает ошибку:

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

Что такое истинное регулярное выражение для этой задачи?

Попробуйте использовать другой разделитель, скажем # :

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

или (менее рекомендуется) избегать каждого появления разделителя в регулярном выражении:

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

Также вы ищете шаблон http:///ftp:// который действительно не имеет большого смысла, может быть, вы имеете в виду http://|ftp:// .

Вы можете сделать свое регулярное выражение короче, как:

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

Понимание ошибки: Unknown modifier '/'

В вашем регулярном выражении '/http:///ftp:///' первый / считается стартовым разделителем и / после : считается окончательным разделителем. Теперь мы знаем, что мы можем предоставить модификатору регулярное выражение, чтобы изменить его поведение по умолчанию. Некоторые такие модификаторы:

  • i : сделать соответствующий регистр нечувствительным
  • m : многострочный поиск

Но то, что видит PHP после закрывающего разделителя, является другим / и пытается интерпретировать его как модификатор, но не удается, что приводит к ошибке.

preg_replace возвращает измененную строку.

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

Например, используйте другой символ разделителя, например «#».

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

И не путайте / и |

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

Длинная история: Regexp должен быть заключен в разделители, и они должны быть уникальными внутри всего регулярного выражения. Если вы хотите использовать /, то остальные / -s внутри регулярного выражения должны быть экранированы. Это, однако, делает синтаксис немного уродливым. К счастью, вы можете использовать любой символ в качестве разделителя. ! отлично работает, как и другие персонажи.

Остальная часть регулярного выражения просто перечисляет два параметра, каждый из которых будет заменен вторым параметром.

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

Используйте это вместо этого:

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

Или

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