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 作为行号:

$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(不区分大小写)会更好?
一个带有foreachand的例子stristr

$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

使用此代码,您可以将所有数据放在一个数组中(行号和位置号)

<?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

Angelo 的答案肯定提供了更多功能,可能是最好的答案,但以下内容很简单,而且似乎有效。我将继续尝试所有解决方案。

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 回答