此代码输出$captured数组,但$captured[1]包含bar/this而不是我的预期bar.我的正则表达式中缺少什么来阻止返回bar?
<?php
$pattern = '/foo/:any/';
$subject = '/foo/bar/this/that';
$pattern = str_replace(':any', '(.+)', $pattern);
$pattern = str_replace(':num', '([0-9]+)', $pattern);
$pattern = str_replace(':alpha', '([A-Za-z]+)', $pattern);
echo '<pre>';
$pattern = '#^' . $pattern . '#';
preg_match($pattern, $subject, $captured);
print_r($captured);
echo '</pre>';
Run Code Online (Sandbox Code Playgroud)
使用非贪婪修饰符使+匹配尽可能少的字符而不是尽可能多的字符:
$pattern = str_replace(':any', '(.+?)', $pattern);
^
Run Code Online (Sandbox Code Playgroud)
您可能还想在正则表达式周围添加分隔符并将其锚定到字符串的开头:
$pattern = '#^/foo/:any/#';
Run Code Online (Sandbox Code Playgroud)