0

私の多くを混乱させた!ここにコードがあります。カウンターである $mc に対して 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
4

2 に答える 2

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

2 番目のパラメーターとして使用される無名関数は、実際の置換を行います。一致を受け取り、置換文字列を返す必要があります。$mcパラメータは句を介して渡され、処理useされた一致の数を追跡します。3 回置換した後、一致した文字列を返すだけです。

于 2013-09-03T08:45:03.217 に答える
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;
于 2013-09-03T08:48:48.370 に答える