php - 在switch语句中使用regexp




switch-statement (4)

PHP switch / case语句中是否允许使用regex以及如何使用它们?


Answers

switch-case语句的作用类似于if-elseif。
除了你可以使用if-elseif的正则表达式,你也可以在switch-case中使用它。

if (preg_match('/John.*/', $name)) {
    // do stuff for people whose name is John, Johnny, ...
}

可以编码为

switch $name {
    case (preg_match('/John.*/', $name) ? true : false) :
        // do stuff for people whose name is John, Johnny, ...
        break;
}

希望这可以帮助。


没有或只有限。 例如,您可以切换为true

switch (true) {
    case $a == 'A':
        break;
    case preg_match('~~', $a);
        break;
}

这基本上给你一个if-elseif-else语句,但是语法和switch (例如,fall-through。)


是的,但是当switch参数变为false时,你应该使用这种技术来避免问题:

switch ($name) {
  case preg_match('/John.*/', $name) ? $name : !$name:
    // do stuff
}

现有答案总结加我自己的两分钱:

1.基本答案

您可以使用header()函数发送新的HTTP标头,但必须在HTML或文本之前将其发送到浏览器(例如,在<!DOCTYPE ...>声明之前)。

header('Location: '.$newURL);

2.重要细节

die()exit()

header("Location: http://example.com/myOtherPage.php");
die();

为什么你应该使用die()exit()thedailywtf.com/Articles/WellIntentioned-Destruction.aspx

绝对网址

该网址必须是绝对的。 请参阅RFC 2616 。 但在大多数情况下,相对URL也会被接受。

状态码

PHP的“位置”标题仍然使用HTTP 302重定向代码,但这不是你应该使用的。 您应该考虑301 (永久重定向)或303 (其他)。

注意: W3C提到 303-header与“许多pre-HTTP / 1.1用户代理不兼容,目前使用的浏览器都是HTTP / 1.1用户代理,对于许多其他用户代理(如蜘蛛和机器人)来说并不是这样。

3.文件

HTTP头和PHP中的header()函数

4.替代品

您可以使用http_redirect($url);的替代方法http_redirect($url); 需要安装PECL包pecl

5.助手功能

此功能不包含303状态码:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

这更加灵活:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6.解决方法

正如前面提到的header()只在写出任何内容之前重定向。 如果调用内部HTML输出,它们通常会失败。 然后,您可以使用HTML标头解决方法(不是很专业!),如:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

或甚至JavaScript重定向。

window.location.replace("http://example.com/");




php switch-statement