Как найти вторую строку между двумя строками

Я работаю над скриптом, который извлекает информацию с определенного веб-сайта. Указанный веб-сайт извлекает информацию из базы данных и отображает ее таким образом, чтобы пользователь мог легко ее прочитать (как всегда).

Представьте, что это выглядит так:

Var1: результат1 Var2: результат2 Var3: результат3

Что делает мой сценарий, так это то, что он читает исходный код страницы и извлекает «результат1», «результат2» и «результат3», получая текст между двумя строками.

Образец кода:

<?php

    function get_string_between($string, $start, $end) {

        $string = " ".$string;
        $ini = strpos($string,$start);
        if ($ini == 0) return "";
        $ini += strlen($start);
        $len = strpos($string,$end,$ini) - $ini;
        return substr($string,$ini,$len);

    }

    function check($url) {

        // usually, $fullstring = file_get_contents($url);
        $fullstring = "<string1>result1</string1><string1>result2</string1><string1>result3</string1>";

        $result = get_string_between($fullstring, "<string1>", "</string1>");

        echo "<b>Result: </b>".$result;

    }

    check("random");    // just to execute the function

?>

Если вам интересно, почему у меня есть функция check(), то это потому, что этот код является частью чего-то большего, и мне нужно решение, которое работает в этом случае, поэтому я постарался сохранить его безупречным.

Теперь я могу легко получить "результат1", потому что это первое вхождение, но как я могу получить "результат2" и "результат3"?

Спасибо :)


php
person user1298923    schedule 07.08.2012    source источник
comment
Помогает ли эта статья?   -  person Matt    schedule 07.08.2012
comment
Мне пришлось перечитать код несколько раз, но я понимаю, что вы пытаетесь здесь сделать.   -  person Matt    schedule 07.08.2012
comment
@Matt Я нашел этот образец очень полезным, он представляет собой еще один способ сделать это, и это определенно подходящий пример для этой ситуации. Проблема в том, что я не знаю точно, сколько вхождений строки, с которой я буду иметь дело, и как будут выглядеть строки (я должен был указать это в исходном вопросе). В случае, если я неправильно понимаю код, разве он не извлекает позицию определенной строки (которую вы определяете)?   -  person user1298923    schedule 07.08.2012
comment
Посмотрите ответ @nickb. Это даст вам то, что вам нужно. Если вы вернете весь массив совпадений, который дает вам его код, вы сможете перебрать его, используя foreach.   -  person Matt    schedule 07.08.2012


Ответы (1)


Используйте регулярное выражение, чтобы извлечь все совпадения, а затем выберите нужные:

function get_string_between($string, $start, $end) 
{
    preg_match_all( '/' . preg_quote( $start, '/') . '(.*?)' . preg_quote( $end, '/') . '/', $string, $matches);
    return $matches[1];
}

Регулярное выражение захватит все, что находится между переменными $start и $end.

Теперь функция возвращает массив всех результирующих значений, из которых вы можете выбрать желаемое:

list( $first, $second, $third) = get_string_between( $string,  "<string1>", "</string1>");

Вы можете увидеть, как это работает в этой демонстрации.

person nickb    schedule 07.08.2012
comment
Сделайте еще один шаг, и вы можете добавить $matches в качестве ссылочного параметра function get_string_between($string, $start, $end, &$matches) {...} - person Matt; 07.08.2012
comment
Спасибо за ответ, у меня два вопроса. 1) Что я могу сделать, если я не знаю количество вхождений (у меня может быть 1,2,3,4,5..200 раз ‹строка1›текст‹/строка1›) и 2) Как я могу получить ТОЛЬКО результат1 вместо строки «результат1» (длина = 7)? Спасибо еще раз - person user1298923; 07.08.2012
comment
Или вы можете вернуть $matches, и программист сможет затем обработать его как array, а не просто строку. - person Matt; 07.08.2012
comment
Это возвращает массив - он будет работать с любым количеством вхождений. Ваш второй вопрос тривиален и показывает непонимание языка. Вы видите вывод из var_dump(), чтобы показать вам тип переменной. Если бы вы только что сделали echo $first; в моем демо, вы бы не получили вывод var_dump(). - person nickb; 07.08.2012
comment
@nickb Да, мне не хватает знаний, когда дело доходит до php, и я понимаю, что это видно, вероятно, поэтому я буду задавать следующий вопрос, который кажется вам базовым: как я могу заставить его работать со случайным числом событий? В вашем примере вы устанавливаете $list($first, $second, $therty), подразумевая, что у нас есть только три вхождения. - person user1298923; 07.08.2012
comment
Вы бы заменили list( ...) = на $array = . Теперь у вас есть массив всех совпадений. Если вам нужно первое совпадение, выполните echo $array[0]; или вы можете использовать цикл foreach для перебора всех совпадений. - person nickb; 07.08.2012