-2
$text = $_POST['text'];  
$find = $_POST['find'];
$offset = 0;
while ($offset < strlen($text))
{
   $pos = strpos($text, $find, $offset);
   $offset += strlen($find);
   echo "$find found in $pos <br>";
}

这个程序有问题。我要做的就是打印 $find 在 $text 中的所有位置。

告诉我问题是什么。尽量不要改变while条件。提前致谢。

4

3 回答 3

1

首先,如果找不到,您需要跳出循环。其次,我认为你想要做的是跳到你找到最后一个 $find 之后的 $text 中的点:

$text = $_POST['text'];  
$find = $_POST['find'];
$offset = 0;
while ($offset < strlen($text))
{
   $pos = strpos($text, $find, $offset);
   // $offset += strlen($find); // removed
   if ( $pos===false ) break;
   $offset = $pos+1;
   echo "$find found in $pos <br>";
}
于 2013-07-16T17:48:30.683 回答
0

另一种更紧凑的方法是这样的:

while ( ($pos=strpos($text,$find,$offset)) !== false) {
    echo "$find found in $pos <br>";
    $offset = $pos+1;
}
于 2013-07-16T18:08:06.840 回答
0

为什么不使用这样的正则表达式:

$text = 'hello world, I want to find you world';
$find = 'world';

preg_match_all('/'.preg_quote($find, '/').'/', $text, $matches, PREG_OFFSET_CAPTURE);
echo '<pre>';
print_r($matches);
echo '</pre>';

返回:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => world
                    [1] => 6
                )

            [1] => Array
                (
                    [0] => world
                    [1] => 32
                )

        )

)

要获得相同的输出,请使用:

$text = $_POST['text'];  
$find = $_POST['find'];
preg_match_all('/'.preg_quote($find, '/').'/', $text, $matches, PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $match) {
    echo "$find found in {$match[1]}<br>";
}
于 2013-07-16T18:08:30.013 回答