2010-09-15 4 views
3
preg_replace('/http:///ftp:///', 'https://', $value); 

http:// и ftp:// внутри $value следует заменить https://Unknown '/' Ошибка модификатора в PHP

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

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

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

ответ

6

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

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 
+0

первый один не работает – James

+0

Вы собираете возвращаемое значение 'preg_replace', как я показал выше? – codaddict

1

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

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

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

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

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

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

+0

Вы можете объяснить это регулярное выражение? – James

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

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

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

Или

preg_replace('/(http|ftp):\/\//', 'https://', $value); 
Смежные вопросы