PHP中的未知修饰符'/'错误

时间:2010-09-15 16:57:00

标签: php regex preg-replace

preg_replace('/http:///ftp:///', 'https://', $value);
http://内的ftp://$value应替换为https://

此代码提供错误:

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

此任务的真正正则表达式是什么?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用另一个分隔符,例如“#”。

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

不要混淆/和|

答案 2 :(得分:1)

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

长篇小说:Regexp需要用分隔符括起来,并且在整个正则表达式中必须是唯一的。如果你想使用/,那么regexp中的剩余/ -s需要被转义。然而,这使得语法看起来有点难看。幸运的是,你可以使用任何字符作为分隔符。 !和其他角色一样工作正常。

正则表达式的其余部分只列出了两个选项,其中任何一个都将替换为第二个参数。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

请改用:

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

或者

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