在PHP中查找多个字符串位置

时间:2010-10-13 11:37:41

标签: php string

我正在编写一个解析给定URL的PHP​​页面。我能做的只是找到第一次出现,但当我回应它时,我得到另一个值而不是给定的值。

这就是我现在所做的。

<?php
$URL = @"my URL goes here";//get from database
$str = file_get_contents($URL);
$toFind = "string to find";
$pos = strpos(htmlspecialchars($str),$toFind);
echo substr($str,$pos,strlen($toFind)) . "<br />";
$offset = $offset + strlen($toFind);
?>

我知道可以使用循环,但我不知道循环体的条件。

如何显示我需要的输出?

4 个答案:

答案 0 :(得分:17)

这是因为您在strpos上使用了htmlspecialchars($str),但您在substr上使用了$str

htmlspecialchars()将特殊字符转换为HTML实体。举一个小例子:

// search 'foo' in '&foobar'

$str = "&foobar";
$toFind = "foo";

// htmlspecialchars($str) gives you "&amp;foobar"
// as & is replaced by &amp;. strpos returns 5
$pos = strpos(htmlspecialchars($str),$toFind);

// now your try and extract 3 char starting at index 5!!! in the original
// string even though its 'foo' starts at index 1.
echo substr($str,$pos,strlen($toFind)); // prints ar

要解决此问题,请在两个函数中使用相同的 haystack

为了回答你在其他问题中找到一个字符串的所有出现的其他问题,你可以使用strpos的第三个参数offset,它指定从哪里搜索。例如:

$str = "&foobar&foobaz";
$toFind = "foo";
$start = 0;
while($pos = strpos(($str),$toFind,$start) !== false) {
        echo 'Found '.$toFind.' at position '.$pos."\n";
        $start = $pos+1; // start searching from next position.
}

输出:

  

在位置1找到foo    在第8位找到了foo

答案 1 :(得分:5)

使用:

while( ($pos = strpos(($str),$toFind,$start)) != false) {  

Explenation: 在)后面设置错误后设置$start),以便$pos = strpos(($str),$toFind,$start)位于()之间。

还使用!= false,因为php.net说: '此函数可能返回布尔FALSE,但也可能返回一个非布尔值,其值为FALSE,例如0""。有关更多信息,请阅读有关布尔值的部分。使用===运算符测试此函数的返回值。

答案 2 :(得分:3)

$string = '\n;alskdjf;lkdsajf;lkjdsaf \n hey judeee \n';
$pattern = '\n';
$start = 0;
while(($newLine = strpos($string, $pattern, $start)) !== false){
    $start = $newLine + 1;
    echo $newLine . '<br>';
}

这可以在门外运行,并且不像上面那样运行无限循环,并且!==允许在位置0处匹配。

答案 3 :(得分:1)

$offset=0;
$find="is";
$find_length=  strlen($find);
$string="This is an example string, and it is an example";
while ($string_position = strpos($string, $find, $offset)) {
    echo '<strong>'.$find.'</strong>'.' Found at '.$string_position.'</br>';
    $offset=$string_position+$find_length;
}