4 Вопрос: Получить строку из указанного слова в другое слово, даже если эти слова встречаются в строке более одного раза

вопрос создан в Thu, May 2, 2019 12:00 AM

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

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

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

    
1
  1. Всегда ли структура одна и та же?
    2019-05-02 14: 48: 08Z
  2. Да, единственное, что изменилось бы, это просто текст между StartDetails и EndDetails
    2019-05-02 14: 50: 04Z
4 ответа                              4                         

Предполагая, что ваша строка всегда имеет одинаковую структуру: Использование 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 
)
    
1
2019-05-02 15: 09: 48Z

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

$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
2019-05-02 15: 01: 53Z
  1. Возможно, все это не нужно /StartDetails(.*)EndDetails/U
    2019-05-02 14: 58: 07Z
  2. Это верно @AbraCadaver, я внес изменения в этом отношении.
    2019-05-02 15: 02: 17Z

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

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

    
0
2019-05-02 14: 58: 38Z

Вы можете использовать array_walk, explode

$senteanceToArray = array_filter(explode('StartDetails',$sentence));
array_walk($senteanceToArray, function(&$v, $k){
 return $v = trim(str_replace('EndDetails', '', $v));
});
echo '<pre>';
print_r($senteanceToArray);

Вы также можете использовать str_replace

$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails  StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
$patterns = ['StartDetails','EndDetails'];
$replacements = ['','#'];
$words = array_map('trim', array_filter(explode("#",str_replace($patterns, $replacements, $sentence))));

Результат: -

Array
(
 [0] => text 1
 [1] => text 2
 [2] => text 3
 [3] => text 4
)
    
0
2019-05-02 15: 07: 57Z
источник размещен Вот