查找字符串的所有匹配项,并返回匹配的行号

时间:2012-10-23 14:27:00

标签: php

我有一个包含一些文本的字符串变量(如下所示)。文本中有换行符,如图所示。我想在文本中搜索给定的字符串,并返回每个行号的匹配数。例如,搜索“关键字”将在第3行返回1匹配,在第5行返回2匹配。

我尝试过使用strstr()。它找到第一场比赛并给我剩下的文字做得很好,所以我可以一次又一次地做,直到没有比赛。问题是我不知道如何确定匹配发生在哪个行号。

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

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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/>";
}

答案 2 :(得分: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;
}