1

テキストを含む文字列変数があります (以下を参照)。テキストには、図のように改行があります。特定の文字列のテキストを検索し、行番号ごとの一致数を返したいと思います。たとえば、「キーワード」を検索すると、3 行目に 1 つの一致が返され、5 行目に 2 つの一致が返されます。

strstr() を使ってみました。最初の一致を見つけて残りのテキストを提供してくれるので、一致がなくなるまで何度でも繰り返すことができます。問題は、一致が発生した行番号を特定する方法がわからないことです。

Hello,
This is some text.
And a keyword.
Some more text.
Another keyword! And another keyword.
Goodby.
4

3 に答える 3

0

このコードを使用すると、すべてのデータを1つの配列(行番号と位置番号)に含めることができます。

<?php
$string = "Hello,
This is some text.
And a keyword.
Some more text.
Another keyword! And another keyword.
Goodby.";

$expl = explode("\n", $string);

$linenumber = 1; // first linenumber
$allpos = array();
foreach ($expl as $str) {

    $i = 0;
    $toFind = "keyword";
    $start = 0;
    while($pos = strpos($str, $toFind, $start)) {
        //echo $toFind. " " . $pos;
        $start = $pos+1;
        $allpos[$linenumber][$i] = $pos;
        $i++; 
    }
    $linenumber++; // linenumber goes one up
}


foreach ($allpos as $linenumber => $position) {
    echo "Linenumber: " . $linenumber . "<br/>";

    foreach ($position as $pos) {
        echo "On position: " .$pos . "<br/>";
    }
    echo "<br/>";
}
于 2012-10-23T14:49:10.090 に答える
0

改行とループでテキストを分割しない理由は、行番号としてインデックス + 1 を使用することです。

$txtParts = explode("\n",$txt);
for ($i=0, $length = count($txtParts);$i<$length;$i++)
{
    $tmp = strstr($txtParts[$i],'keyword');
    if ($tmp)
    {
        echo 'Line '.($i +1).': '.$tmp;
    }
}

テスト済み、動作中。テキスト(文、大文字と小文字など)で一致を探しているので、おそらくstristr(大文字と小文字を区別しない)の方が良いでしょうか?と
の例:foreachstristr

$txtParts = explode("\n",$txt);
foreach ($txtParts as $number => $line)
{
    $tmp = stristr($line,'keyword');
    if ($tmp)
    {
        echo 'Line '.($number + 1).': '.$tmp;
    }
}
于 2012-10-23T14:32:53.930 に答える
0

アンジェロの答えは間違いなくより多くの機能を提供し、おそらく最良の答えですが、以下は簡単でうまくいくようです. 私はすべてのソリューションで遊び続けます。

function findMatches($text,$phrase)
{
    $list=array();
    $lines=explode("\n", $text);
    foreach($lines AS $line_number=>$line)
    {
        str_replace($phrase,$phrase,$line,$count);
        if($count)
        {
            $list[]='Found '.$count.' match(s) on line '.($line_number+1);
        }
    }
    return $list;
}
于 2012-10-23T15:01:35.777 に答える