1

記事を取得し、その記事で「キーワード」を検索し、そのキーワードをランダムにアンカーリンクに置き換えるスクリプトを開発しています。

スクリプトは正常に動作していますが、関数をループしてランダムな場所に挿入するには、「置換」の配列が必要です。

したがって、最初のランダムな位置はアンカー リンク #1 を取得します。2 番目のランダムな位置は、アンカー リンク #2 を取得します。3 番目のランダムな位置は、アンカー リンク #3 を取得します。等...

ここで私の質問に対する答えの半分を見つけました: PHP replace a random word of string

public function replace_random ($str, $search, $replace, $n) {

    // Get all occurences of $search and their offsets within the string
    $count = preg_match_all('/\b'.preg_quote($search, '/').'\b/', $str, $matches, PREG_OFFSET_CAPTURE);

    // Get string length information so we can account for replacement strings that are of a different length to the search string
    $searchLen = strlen($search);
    $diff = strlen($replace) - $searchLen;
    $offset = 0;

    // Loop $n random matches and replace them, if $n < 1 || $n > $count, replace all matches
    $toReplace = ($n < 1 || $n > $count) ? array_keys($matches[0]) : (array) array_rand($matches[0], $n);
    foreach ($toReplace as $match) {
        $str = substr($str, 0, $matches[0][$match][1] + $offset).$replace.substr($str, $matches[0][$match][1] + $searchLen + $offset);
        $offset += $diff;
    }

    return $str;

}

だから私の質問は、 $replace 変数の配列を受け入れるようにこの関数を変更するにはどうすればよいですか?

編集 また、置換の配列から置換を出力する mt_rand からランダムな配列キーを取得しようとしましたが、コンテンツ全体で置換の 1 つだけを追加しています。関数が見つけた $search 変数のインスタンスごとに 1 つの「キーワード」を選択するようにしたいと思います。

public function replace_random ($str, $search, $replace, $n) {

    // Get all occurences of $search and their offsets within the string
    $count = preg_match_all('/\b'.preg_quote($search, '/').'\b/', $str, $matches, PREG_OFFSET_CAPTURE);

    // Get string length information so we can account for replacement strings that are of a different length to the search string
    $searchLen = strlen($search);
    $diff = strlen($replace) - $searchLen;
    $offset = 0;

    $searchCount = count($replace);
    $arrayNum = mt_rand(0, 4);

    // Loop $n random matches and replace them, if $n < 1 || $n > $count, replace all matches
    $toReplace = ($n < 1 || $n > $count) ? array_keys($matches[0]) : (array) array_rand($matches[0], $n);
    foreach ($toReplace as $match) {
        $str = substr($str, 0, $matches[0][$match][1] + $offset).$replace[$arrayNum].substr($str, $matches[0][$match][1] + $searchLen + $offset);
        $offset += $diff;
    }

    return $str;

}
4

1 に答える 1

0

解決策は、変数を foreach ループに追加する必要があることが判明しました。

$replaceRand    =   $replace[array_rand($replace)];

$str 変数で呼び出します。

$str = substr($str, 0, $matches[0][$match][1] + $offset).$replaceRand.substr($str, $matches[0][$match][1] + $searchLen + $offset);

コード全体は次のようになりました。

public function replace_random ($str, $search, $replace, $n) {

    // Get all occurences of $search and their offsets within the string
    $count = preg_match_all('/\b'.preg_quote($search, '/').'\b/', $str, $matches, PREG_OFFSET_CAPTURE);

    // Get string length information so we can account for replacement strings that are of a different length to the search string
    $searchLen = strlen($search);
    $diff = strlen($replace) - $searchLen;
    $offset = 0;

    // Loop $n random matches and replace them, if $n < 1 || $n > $count, replace all matches
    $toReplace = ($n < 1 || $n > $count) ? array_keys($matches[0]) : (array) array_rand($matches[0], $n);
    foreach ($toReplace as $match) {
        $replaceRand    =   $replace[array_rand($replace)];
        $str = substr($str, 0, $matches[0][$match][1] + $offset).$replaceRand.substr($str, $matches[0][$match][1] + $searchLen + $offset);
        $offset += $diff;
    }

    return $str;

}
于 2012-11-13T14:50:18.630 に答える