困惑了我很多!这是代码。我得到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
答案 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;