-1

preg_match_all をなんとか使用した後、一致したテキストをmatchedTextに置き換えたいと思いますが、機能していないようです。私のコードを見てください。何が間違っていますか?

    <?php
    $tweets = getTweets($profile->twitter_id);

    for($i=0;$i<4;$i++):
        // finds matches
        $num_matches = preg_match_all('/@\w+/', $tweets[$i]->description, $matches);

        if($num_matches):
            echo $num_matches.'<br />';
            for($c=0;$c<$num_matches;$c++):

                $subject = $tweets[$i]->description;
                $pattern = array();
                $pattern[$c] = $matches[0][$c];
                $replacement = array();
                $replacement[$c] = '<a href="https://twitter.com/#!/">'.$matches[0][$c].'</a>';

            endfor;
                echo preg_replace($pattern, $replacement, $subject).'<br /><br />';

        else:
            echo auto_link($tweets[$i]->description).'<br /><br />';
        endif;
    endfor;
?>
4

3 に答える 3

5

$patternループの外側で定義する必要があり$replacementます。そうしないと、反復ごとに空の配列に再初期化されます。

$pattern = array(); $replacement = array();
for($c=0;$c<$num_matches;$c++):
于 2012-07-02T22:17:48.510 に答える
2

たぶん、preg_replaceパターンを使用せずに -ing:$matches[0][$c]区切り記号付きのパターンではなく、文字列を保持します。繰り返しますが、私は間違っているかもしれません。一致するものと置き換えているものを確認すると役立つ場合があります

Nips、ループ内の配列宣言も見落としていたなんて信じられません... もちろん、それは最初に修正する必要があります!

于 2012-07-02T22:17:45.323 に答える
0

回答ありがとうございます。ただし、preg_replace の使用をやめ、代わりに str_replace を使用しました。それは正常に動作します。これが私の最終的なコードです。

    <?php
        $tweets = getTweets($profile->twitter_id);

        for($i=0;$i<4;$i++):
            // first, explode the description to eliminate the username in the description
            $tweet_des = $tweets[$i]->description;
            $tweet_no_username_des = explode(':',$tweet_des,2); // added a limit parameter, ensuring only the username will be excluded
            $new_tweet_description = $tweet_no_username_des[1].'<br />';

            // the date the tweet is published
            echo $date_pub = $tweets[$i]->pubDate;

            // using preg_match_all to find matches, texts having '@' as the first letter
            $num_matches = preg_match_all('/@\w+/', $tweets[$i]->description, $matches);
            if($num_matches):   // if match(es) are found
                $search_arr = array();  // declared an array to contain the search parameter for str_replace
                $replace_arr = array(); // declared an array to contain the replace parameter for str_replace
                for($c=0;$c<$num_matches;$c++):
                    $search_arr[$c] = $matches[0][$c];
                    $name_links[$c] = explode('@',$search_arr[$c]);
                    $not_link_name = $name_links[$c][1];
                    $replace_arr[$c] = '<a href="http://twitter.com/#!/'.$not_link_name.'" target="_blank">'.$matches[0][$c].'</a>';
                endfor;
                echo auto_link(str_replace($search_arr, $replace_arr, $new_tweet_description)).'<br />';
            else:
                echo auto_link($new_tweet_description).'<br />';
            endif;
        endfor;
    ?>

最初の問題は、「@」で始まるテキストを見つけて、それを Twitter のそれぞれのアカウントにリンクすることでした。私のコードを自由に批判してください。それでもまだバグがあると思います。:)

于 2012-07-03T21:21:20.243 に答える