我有一个包含一些文本的字符串变量(如下所示)。文本中有换行符,如图所示。我想在文本中搜索给定的字符串,并返回每个行号的匹配数。例如,搜索“关键字”将在第3行返回1匹配,在第5行返回2匹配。
我尝试过使用strstr()。它找到第一场比赛并给我剩下的文字做得很好,所以我可以一次又一次地做,直到没有比赛。问题是我不知道如何确定匹配发生在哪个行号。
Hello,
This is some text.
And a keyword.
Some more text.
Another keyword! And another keyword.
Goodby.
答案 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
(不区分大小写)会更好吗?
一个例子使用foreach
和stristr
:
$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;
}