在 PHP 中,如果我有一个长字符串,即 10'000 个字符,你会建议我如何在给定位置之前和之后查找某个字符串的第一次出现。
IE,如果我有字符串:
BaaaaBcccccHELLOcccccBaaaaB
我可以使用 strpos 找到 HELLO 的位置。那么我怎么能找到 B 在 HELLO 之前第一次出现和 B 在 HELLO 之后第一次出现的位置呢?
您可以使用 stripos() 和 strripos() 来查找字符串中第一次出现的子字符串。您还可以为 strripos() 函数提供负偏移量,以反向搜索(从右到左)。带负偏移量的 strripos()
$body = "BaaaaBcccccHELLOcccccBaaaaB";
$indexOfHello = stripos($body, 'Hello');
if ($indexOfHello !== FALSE)
{
// First Occurrence of B before Hello
$indexOfB= stripos(substr($body,0,$indexOfHello),'B',($indexOfHello * -1));
print("First Occurance of B before Hello is ".$indexOfB."\n") ;
// First Occurrence of B before Hello (in reverse order)
$indexOfB= strripos($body,'B',($indexOfHello * -1));
print("First Occurrence of B before Hello (in reverse order) is ".$indexOfB."\n") ;
// First Occurrence of B after Hello
$indexOfB= stripos($body,'B',$indexOfHello);
print("First Occurance of B after Hello is ".$indexOfB."\n") ;
}
如果您考虑优化,则有很多模式搜索算法
这是朴素模式搜索的示例:
/**
* Naive algorithm for Pattern Searching
*/
function search(string $pat, string $txt, int $searchFrom = 0, ?int $searchTill = null)
{
$M = strlen($pat);
$N = strlen($txt);
if ($searchTill !== null && $searchTill < $N){
$N = $searchTill;
}
for ($i = $searchFrom; $i <= $N - $M; $i++)
{
// For current index i,
// check for pattern match
for ($j = 0; $j < $M; $j++)
if ($txt[$i + $j] != $pat[$j])
break;
// if pat[0...M-1] =
// txt[i, i+1, ...i+M-1]
if ($j == $M)
return $i;
}
}
// Driver Code
$txt = "BaaaaBcccccHELLOcccccBaaaaB";
if (null!==($helloPos = search("HELLO", $txt))){
print("First Occurance of B before Hello is ".search("B", $txt, 0, $helloPos)."<br>") ;
print("First Occurance of B after Hello is ".search("B", $txt, $helloPos, null)."<br>") ;
}
给定位置……</p>
要查找之前的第一次出现,您可以substr()
在匹配之前使用strrpos()
.
要查找之后的第一次出现,您仍然可以使用strpos()
并设置偏移参数。