2017-06-01 81 views
2

我在switch语句中创建一个preg_match()有一些问题。带有preg_match的PHP switch语句

我想编写匹配/ oop/page/view/[some-number]的preg_match。

现在它的工作,如:

如果我在浏览器中运行http://example.com/oop/page/view/1它显示“404页”。 而当我运行一些地址,例如http://example.com/oop/page/view/test甚至/ oop /测试其运行第二种情况,但不知道如何。可以肯定的事情是错误的,我的正则表达式expresion ..

public function check(){ 
    $url = filter_input(INPUT_GET, 'url'); 
    switch ($url) { 
     case '': 
      echo 'HomePage'; 
      break; 
     case preg_match('#^/oop/page/view/\d+$#', $url): 
      echo $url; 
      break; 
     default: 
      echo '404 page'; 
      break; 
    } 

} 
+0

随着inproper使用'之开关,'^/OOP /网页/视图/ \ d + $'不会的匹配'http:// example.com/oop/page/view/1',因为'^'锚点。删除'^'它应该可以工作。 https://3v4l.org/lHgqm – AbraCadaver

+0

@AbraCadaver谢谢你的回答,但正如你可以看到我没有用http://检查完整地址,但只是url参数在我的情况下,等于$ _SERVER ['REQUEST_URI “]。 –

+0

OK,习惯显示准确的数据,包含什么变量等... – AbraCadaver

回答

1

你应该做的却是这样的:

switch (true) { 
    case preg_match(...): 

我不记得,如果在PHP开关是严格或宽松相比,但如果它是严格的,只需在每个案例前面放一个!!将其转换为布尔值。

+2

注意: 请注意,开关/外壳没有宽松的比较。 http://php.net/manual/en/control-structures.switch.php – Lando

+0

还需要将第一种情况更改为'case $ url =='':' – Barmar

+0

@Landen Cool,谢谢兰登。 – Brad

1

switch语句将每个case表达式与switch()中的原始表达式进行比较。所以

case preg_match('#^/oop/page/view/\d+$#', $url): 

类似于:

if ($url == preg_match('#^/oop/page/view/\d+$#', $url)) 

这显然不是你想要的。如果你想测试不同类型的表达式,不使用switch(),使用if/elseif/else

if ($url == '') { 
    echo 'Homepage'; 
} elseif (preg_match('#^/oop/page/view/\d+$#', $url)) { 
    echo $url; 
} else { 
    echo '404 page'; 
} 
+1

'switch()'实际上完全适用于你只需要匹配的事物列表,或者将事例组合在一起(没有'break')。这是正确的控制结构。请参阅我的回答,以获取相关信息。 – Brad

+0

@布拉德我通常认为倒转的'switch/case'是一个变态。它提供任何好处的唯一情况是,如果您需要没有“中断”的穿透,但这非常罕见。 – Barmar

+0

@Brad将条件组合在一起可以使用'if()'中的'||'完成。 – Barmar