2

クエリ単語の前後にいくつかの単語を抽出して表示する必要があります。たとえば、Google検索結果などです。

$str = "hi user! welcome to new php open source world, we are trying to learn you something!";
$query = "new php";
$result = "... welcome to new php open source ...";

私はグーグルでSOを検索しましたが、明確な答えが見つからなかったか、おそらく私のphpの知識が十分ではありませんでした!この仕事をするための実行可能で使いやすい機能はありますか?

4

5 に答える 5

6
function yourFuncName($str, $query, $numOfWordToAdd) {
    list($before, $after) = explode($query, $str);

    $before = rtrim($before);
    $after  = ltrim($after);

    $beforeArray = array_reverse(explode(" ", $before));
    $afterArray  = explode(" ", $after);

    $countBeforeArray = count($beforeArray);
    $countAfterArray  = count($afterArray);

    $beforeString = "";
    if($countBeforeArray < $numOfWordToAdd) {
        $beforeString = implode(' ', $beforeArray);
    }
    else {
        for($i = 0; $i < $numOfWordToAdd; $i++) {
            $beforeString = $beforeArray[$i] . ' ' . $beforeString; 
        }
    }

    $afterString = "";
    if($countAfterArray < $numOfWordToAdd) {
        $afterString = implode(' ', $afterArray);
    }
    else {
        for($i = 0; $i < $numOfWordToAdd; $i++) {
            $afterString = $afterString . $afterArray[$i] . ' '; 
        }
    }

    $string = $beforeString . $query . ' ' . $afterString;

    return $string;
}

出力は次のとおりです: user! welcome to new php open source world,$ numOfWordToAdd = 3

于 2012-09-27T20:27:31.620 に答える
3

これは、私が何をどのように行ったかが明確であるという実例です。

<?php

$str = "hi user! welcome to new php open source world, we are trying to learn you something!";
$query = "new php";    

$expl = explode($query, $str);

    // items on the left side of middle string
    $expl_left = explode(" ", $expl[0]);

    $left_cnt = count($expl_left);

    $new_left = $expl_left[$left_cnt-3] . " " . $expl_left[$left_cnt-2];

    // items on the right side of middle string
    $expl_right = explode(" ", $expl[1]);

    $new_right = $expl_right[1] . " " . $expl_right[2];

    // new string formated
    $new = "... " . $new_left . " " . $query . " " . $new_right . " ...";

print $new;

?>

ご不明な点がございましたら、お気軽にお問い合わせください...

于 2012-09-27T20:17:01.093 に答える
1
$result = preg_replace('/(.+)?([^\s]+.{10}'.$query.'.{10}[^\s]+)(.+)?/', '... $2 ...', $str);

これにより、指定した同じ文字列とクエリから同じ結果が返されます。前または後の長さが単語の途中で(それぞれ)開始または終了する場合、単語が終了する前に単語が完了するまで継続します。

于 2012-09-27T20:04:09.853 に答える
0

new php「単語」が空白以外の文字のシリーズであると仮定すると、以下は文字列の両側に3つの単語を抽出しますが$subject、必要に応じてそれより少なく受け入れます。

if (preg_match('/(?:\S+\s+){1,3}new php(?:\s+\S+){1,3}/', $subject, $regs)) {
    $result = $regs[0];
}

sを任意の数に変更し3ます。

于 2012-09-27T20:06:55.433 に答える
0

explodeで次の関数を使用しました。

public static function returnSearch($query, $str, $wordcount) {
    $explode = explode($query, $str);
    $result = null;
    //if explode count is one the query was not found
    if (count($explode) == 1) {
        $result = implode(' ', array_slice(str_word_count($explode[0], 2), -$wordcount, $wordcount)) . " ";
    }
    //if explode count is more than one the query was found at least one time
    if (count($explode) > 1) {
        //check for if the string begins with the query
        if (!empty($explode[0])) {
            $result =  "..." . implode(' ', array_slice(str_word_count($explode[0], 2), -$wordcount, $wordcount)) . " ";
        }
        $result = $result . $query;
        if (!empty($explode[1])) {
            $result = $result . " " . implode(' ', array_slice(str_word_count($explode[1], 2), 0, $wordcount)) . "...";
        }
    }
    //return result
    return $result;
}
于 2016-06-13T16:59:54.537 に答える