这个问题已经在这里有了答案: > My regex is matching too much. How do I make it stop? 5个
这段代码输出$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>';
解决方法:
使用non-greedy modifier使匹配的字符尽可能少,而不是尽可能多:
$pattern = str_replace(':any', '(.+?)', $pattern);
^
您可能还想在正则表达式周围添加delimiters并将其锚定到字符串的开头:
$pattern = '#^/foo/:any/#';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。