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

发布于 2024-09-19 10:18:29 字数 329 浏览 5 评论 0原文

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

$value 里面的 http://ftp:// 应该替换成 https://

这个代码给出错误:

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

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

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

http:// and ftp:// inside $value should be replaced with https://

This code gives error:

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

What is a true regex for this task?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

柒七 2024-09-26 10:18:30

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

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

并且不要混淆 / 和 |

Use another delimiter character, like '#', for instance.

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

And do not confuse / and |

送舟行 2024-09-26 10:18:30
preg_replace('!(http://|ftp://)!', 'https://', $value);

长话短说:正则表达式需要用分隔符括起来,并且这些分隔符在整个正则表达式中必须是唯一的。如果要使用 /,则需要对正则表达式中剩余的 /-s 进行转义。然而,这使得语法看起来有点难看。幸运的是,您可以使用任何字符作为分隔符。 !效果很好,其他角色也一样。

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

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

Long story: Regexp needs to be enclosed in delimiters, and those have to be unique inside the whole regexp. If you want to use /, then the remaining /-s inside the regexp need to be escaped. This however makes the syntax look a bit ugly. Luckily you can use any character as delimiter. ! works fine, as will other characters.

The rest of the regexp just lists two options, either of which will be replaced with the second parameter.

十雾 2024-09-26 10:18:30
preg_replace('|http:\/\/ftp:\/\/', 'https://|', $value);
preg_replace('|http:\/\/ftp:\/\/', 'https://|', $value);
旧时光的容颜 2024-09-26 10:18:30

使用这个代替:

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

或者

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

Use this instead:

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

Or

preg_replace('/(http|ftp):\/\//', 'https://', $value);
只涨不跌 2024-09-26 10:18:29

尝试使用不同的分隔符,例如 #

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

或(不太推荐)转义正则表达式中出现的每个分隔符:

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

此外,您正在搜索模式 http:///ftp:// 这确实没有多大意义,可能你的意思是http://|ftp://

您可以使正则表达式更短,如下所示:

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

理解错误: 未知修饰符 '/'

在正则表达式中 '/http:///ftp:///',第一个 / 被视为起始分隔符,: 之后的 / 被视为结束分隔符。现在我们知道我们可以为正则表达式提供修饰符来改变其默认行为。一些这样的修饰符是:

  • i :匹配大小写
    不敏感的
  • m :多行搜索

但是 PHP 在结束分隔符后看到的是另一个 / 并尝试将其解释为修饰符,但失败,导致错误。

preg_replace 返回更改后的字符串。

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

Try using a different delimiter, say #:

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

or (less recommended) escape every occurrence of the delimiter in the regex:

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

Also you are searching for the pattern http:///ftp:// which really does not make much sense, may be you meant http://|ftp://.

You can make your regex shorter as:

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

Understanding the error: Unknown modifier '/'

In your regex '/http:///ftp:///', the first / is considered as starting delimiter and the / after the : is considered as the ending delimiter. Now we know we can provide modifier to the regex to alter its default behavior. Some such modifiers are:

  • i : to make the matching case
    insensitive
  • m : multi-line searching

But what PHP sees after the closing delimiter is another / and tries to interpret it as a modifier but fails, resulting in the error.

preg_replace returns the altered string.

$value = 'http://foo.com';
$value = preg_replace('#http://|ftp://#', 'https://', $value);
// $value is now https://foo.com
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文