php - 计数器不在foreach中工作

时间:2013-09-03 08:33:43

标签: php

困惑了我很多!这是代码。我得到1美元,这是一个柜台!我设置3次后无法从foreach循环中断。

代码:

$mc=0;    
if(preg_match_all('/(\@\`)([^`]*)(`\:)/i', $txt, $matches)) {       
    foreach(@$matches[2] as $m) {
        $mc++;
        if($mc>3)
            break;

    $txt = str_replace("@`".$m."`:",'<a href="profile-'.$m.'">'.$m.'</a>:',$txt);       
    }
}

示例文本:

@`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234

2 个答案:

答案 0 :(得分:2)

这是因为您从匹配过程中单独进行替换,因此会替换多个相同的条目。请考虑使用preg_replace_callback()代替:

$txt = '@`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234 @`test`: test1234';

$mc = 0;
echo preg_replace_callback('/@`([^`]+)`(?=:)/', function($match) use (&$mc) {
    if (++$mc <= 3) {
        return sprintf('<a href="profile-%s">%s</a>',
            urlencode($match[1]),
            htmlspecialchars($match[1], ENT_QUOTES, 'UTF-8')
        );
    } else {
        return $match[1];
    }
}, $txt);

输出:

<a href="profile-test">test</a>: test1234 
<a href="profile-test">test</a>: test1234 
<a href="profile-test">test</a>: test1234 
test: test1234 test: test1234 test: test1234 test: test1234 test: test1234 test: test1234 test: test1234 test: test1234

用作第二个参数的匿名函数进行实际替换;它接收匹配并应返回替换字符串; $mc参数通过use子句传入,以跟踪已处理的匹配项数。在三次替换后,它将只返回匹配的字符串。

答案 1 :(得分:1)

你总是覆盖$txt。您必须将字符串与.=

合并
$string .= str_replace("@`".$m."`:",'<a href="profile-'.$m.'">'.$m.'</a>:',$txt);

就像这整个一样:

$mc=0;    
if(preg_match_all('/(\@\`)([^`]*)(`\:)/i', $txt, $matches)) {       
    foreach($matches[2] as $m) {
        $mc++;
        if($mc>3)
            break;

        $string .= str_replace("@`".$m."`:",'<a href="profile-'.$m.'">'.$m.'</a>:',$txt);       
    }
}

echo $string;