С такой строкой:

$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails  StartDetails text 3 EndDetails StartDetails text 4 EndDetails';

Как я могу получить текст между StartDetails и EndDetails словами, даже если они встречаются в строке n раз?

php
2
Errol28Rose 2 Май 2019 в 17:42

3 ответа

Лучший ответ

Предполагая, что ваша строка всегда имеет одинаковую структуру: Использование explode () в цикле является возможным вариантом:

$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails  StartDetails text 3 EndDetails StartDetails text 4 EndDetails';

$a = explode("StartDetails", $sentence);

foreach($a as $k=>$v){
    if(!empty($v)){
        $b[] = explode( "EndDetails", $v)[0];
    }
}

print_r($b);

// output
Array
(
    [0] =>  text 1 
    [1] =>  text 2 
    [2] =>  text 3 
    [3] =>  text 4 
)
2
B001ᛦ 2 Май 2019 в 15:09

Попробуйте это регулярное выражение (?<=StartDetails\s).*?(?=\s+EndDetails). Это соответствует всему между StartDetails и EndDetails. Регулярное выражение использует шаблоны Lookahead и Lookbehind для сопоставления более чем одному значению.

Затем используйте preg_match_all в PHP.

2
KFoobar 2 Май 2019 в 14:58

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

$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails  StartDetails text 3 EndDetails StartDetails text 4 EndDetails';

preg_match_all('/StartDetails(.*)EndDetails/U', $sentence, $outputArray);

print_r($outputArray);

В $outputArray вторым элементом должен быть массив всех возможных текстов между StartDetails и EndDetails.

Ключевыми моментами, которые следует здесь отметить, является использование модификатора U, который делает сопоставление жадным, и функцию preg_match_all вместо простого preg_match, который соответствует всем вхождениям

ИЗМЕНИТЬ

Поскольку нам не нужно сопоставлять StartDetails или EndDetails, я изменил это

preg_match_all('/(StartDetails)(.*)(EndDetails)/U', $sentence, $outputArray);

К

preg_match_all('/StartDetails(.*)EndDetails/U', $sentence, $outputArray);
1
Chuksy 2 Май 2019 в 15:01