Php 如何计算匹配数并在正则表达式中使用它?

Php 如何计算匹配数并在正则表达式中使用它?,php,regex,Php,Regex,我试图得到这个结果: <li class="beatle_1">Paul</li> <li class="beatle_2">John</li> <li class="beatle_3">George</li> <li class="beatle_4">Ringo</li> Jörg Westheide:“没错,lib pcre没有。我也没有(现在)找到了一种以完全兼容Perl的方式实现g修饰符的方

我试图得到这个结果:

<li class="beatle_1">Paul</li> <li class="beatle_2">John</li> <li class="beatle_3">George</li> <li class="beatle_4">Ringo</li>

Jörg Westheide:“没错,lib pcre没有。我也没有(现在)找到了一种以完全兼容Perl的方式实现g修饰符的方法。有关问题内容的详细信息,请参阅perlre手册页中的“重复模式匹配零长度子字符串”部分。如果这不适用于您的问题,您应该能够通过循环解决问题。”

对于PHP5.3,您可以使用匿名函数进行此操作

看这个例子

echo preg_replace_callback('/([\w]+)/', function ($matches) {
    static $pos = 0;
    return sprintf('<li class="beatle_%d">%s</li>', ++$pos, $matches[1]);
}, 'Paul John George Ringo');
echo preg\u replace\u回调('/([\w]+)/',函数($matches){
静态$pos=0;
返回sprintf(“
  • %s
  • ”,++$pos,$matches[1]); }“保罗·约翰·乔治·林戈”);
    如果您使用的是PHP5.3,您可以尝试使用闭包来替换回调():

    $subject = 'Paul John George Ringo';
    $n = 0;
    echo preg_replace_callback('/([\w]+)/', function($matches) use (&$n) {
        return '<li class="beatle_'.(++$n).'">'.$matches[1].'</li>';
    }, $subject);
    
    $subject='pauljohngeorgeringo';
    $n=0;
    echo preg_replace_回调('/([\w]+)/'),函数($matches)使用(&$n){
    返回“
  • 。$matches[1]。
  • ”; }(主题),;
    这似乎是对正则表达式的严重滥用。为什么一定要用正则表达式执行此操作?您可以通过执行preg\u match和preg\u match\u来获得匹配的结果。有关详细信息,请访问此处。但是这里的事情又变得复杂了。或者,在5.3之前,您可以使用常规函数使用
    preg\u replace\u callback
    。在python中有什么方法可以做到这一点吗?(捕获匹配组使用“*”运算符重复的次数)??抱歉,您的代码返回:
  • Paul
  • John
  • George
  • Ringo
  • 顺便说一句,我使用的是:PHP5.3.5(cli)(构建时间:2011年1月7日18:14:45),版权(c)1997-2010 PHP组,Zend Engine v2.3.0,版权所有(c)1998-2010 Zend Technologies您是否确保使用:
    使用(&$n)
    ?(注意引用)。我得到了预期的结果:“
  • Paul
  • John
  • George
  • Ringo
  • ”关于PHP5.3.3(cli)(构建时间:2010年9月28日13:38:04)版权(c)1997-2010 PHP Group Zend Engine v2.3.0,版权(c)1998-2010 Zend Technologies
    echo preg_replace_callback('/([\w]+)/', function ($matches) {
        static $pos = 0;
        return sprintf('<li class="beatle_%d">%s</li>', ++$pos, $matches[1]);
    }, 'Paul John George Ringo');
    
    $subject = 'Paul John George Ringo';
    $n = 0;
    echo preg_replace_callback('/([\w]+)/', function($matches) use (&$n) {
        return '<li class="beatle_'.(++$n).'">'.$matches[1].'</li>';
    }, $subject);