Php preg_match无法使用óá

时间:2017-04-05 06:14:22

标签: php regex preg-replace preg-match

嘿我的路由脚本不能使用特殊字符,我不知道为什么或如何解决它。

我的网址:/test/x/hállò/123
我的路由器添加了URL:/ test /:varx /:variableZ / 123

$route['url'] ="/test/x/:name/123";
$reqMet = $_SERVER['REQUEST_METHOD'];
$route['method'] = "GET";
$reqUrl = "/test/x/hállò/123";
$matches = Array();

$pattern = "@^" . preg_replace('/\\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['url'])) . "$@D";

if($reqMet == $route['method'] && preg_match($pattern, $reqUrl, $matches)) {
  echo "THIS SHOULD BE THE OUTPUT";
}

所以它没有使用像lòl或Háy这样的词,但我找回了正确的Url,但像article / test / 123这样的东西都很完美。

希望有人能帮到我。 感谢

修改

所以这是有效的

$router->addRoute('GET','/test/x/hállò/123','home/main',false);

网址>> http://localhost/test/x/hállò/123

但这不是

$router->addRoute('GET','/test/x/:name/123','home/main',false`);

网址>> http://localhost/test/x/hállò/123

:name用于可替换的变量,如Article id或者无论如何。

1 个答案:

答案 0 :(得分:1)

虽然看起来您可能需要包含其他几个带重音和/或非英语的字母,但我只会包含您提到的字母。

替代且超宽松的模式(可能不够安全)将是\\\:[^\/]+

代码:

$route['url'] ="/test/x/:name/123";
$reqUrl = "/test/x/hállò/123";

echo "Input:\n";
var_export(preg_quote($route['url']));

$pattern="@^".preg_replace('/\\\:[a-zA-Z0-9áò_-]+/','([a-zA-Z0-9áò_-]+)',preg_quote($route['url']))."$@D";
//                                         ^^ new letters here: ^^

if(preg_match($pattern, $reqUrl, $matches)) {
    echo "\n\nOutput\n";
    var_export($matches);
}else{
    echo "\n\nNo Match";
}

显示器:

Input:
'/test/x/\\:name/123'

Output
array (
  0 => '/test/x/hállò/123',
  1 => 'hállò',
)