Я пишу PHP-страницу, которая анализирует данный URL. Я могу только найти первое вхождение, но когда я его повторяю, я получаю другое значение, а не данное.
это то, что я делал до сих пор.
<?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); ?>
Я знаю, что цикл можно использовать, но я не знаю условия, ни тело цикла.
И как я могу показать результат, который мне нужен?
Это происходит потому, что вы используете strpos
на htmlspecialchars($str)
но вы используете substr
на $str
.
htmlspecialchars()
преобразует специальные символы в объекты HTML. Возьмите небольшой пример:
// search 'foo' in '&foobar' $str = "&foobar"; $toFind = "foo"; // htmlspecialchars($str) gives you "&foobar" // as & is replaced by &. 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
Чтобы исправить это, используйте одну и ту же стопку в обеих функциях.
Чтобы ответить на другой вопрос об обнаружении всех вхождений одной строки в другую, вы можете использовать третий аргумент 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. }
Вывод:
Найден foo в позиции 1
Найден foo в позиции 8
Использование:
while( ($pos = strpos(($str),$toFind,$start)) != false) {
Explenation: Set )
после false за $start)
, так что $pos = strpos(($str),$toFind,$start)
помещается между ()
.
Также используйте != false
False, потому что php.net говорит: «Эта функция может возвращать Boolean FALSE
, но может также возвращать небулевое значение, которое оценивается как FALSE
, например 0
или ""
. Пожалуйста, прочитайте раздел о Booleans для получения дополнительной информации. Используйте оператор ===
для проверки возвращаемого значения этой функции.
$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.
$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; }