PHP preg_match_all: извлечение определенных строк

У меня проблема. Мне нужно получить несколько строк такой страницы:

Text text text ...

Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...

Мне нужен фильтр, чтобы отображалось только следующее:

Porto-Portugal-May-2013
Barcelona-Spain-April-2013
Madrid-Spain-April-2013

(строки с 3 тире)

Это возможно с preg_match_all или другой функцией?

Я использую cURL для получения содержимого страницы.

Я пытался:

$body = " Text text text ...

Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...";

preg_match_all("/^(.*?)-(.*?)-(.*?)-(.*?)\/",$body, $match);

for($i=0;$i<sizeof($match[1]);$i++)
  {
    echo $match[1][$j].'<br/>';
  }

Спасибо.


person ptCoder    schedule 26.11.2014    source источник
comment
Поделитесь, пожалуйста, тем, что вы пробовали. SO - это не служба кодирования.   -  person Jay Blanchard    schedule 26.11.2014
comment
Я обновил вопрос образцом. Спасибо.   -  person ptCoder    schedule 26.11.2014
comment
Что не так с результатом?   -  person Niet the Dark Absol    schedule 26.11.2014
comment
Результат не возвращается. Пусто...   -  person ptCoder    schedule 26.11.2014


Ответы (2)


^ означает «начало строки».

Добавьте модификатор m, чтобы вместо этого он означал «начало строки».

Тогда проще:

preg_match_all("/^(?:[^-\n]+-){3}[^-\n]+$/m",$body,$matches);

var_dump($matches[0]);

Это должно вывести массив, содержащий каждую совпавшую строку.

person Niet the Dark Absol    schedule 26.11.2014
comment
Я получаю такой результат: array (size = 3) 0 = ›string 'Текстовый текст ... Porto-Portugal-May-2013' (length = 47) 1 =› string 'Barcelona-Spain-April-2013 Text text text текстовый текст ... '(длина = 61) 2 = ›строка' Мадрид-Испания-апрель-2013 Текстовый текстовый текст ... '(длина = 45) - person ptCoder; 26.11.2014
comment
@ptCoder А, конечно, это позволяет строкам совпадать посередине. Я отредактировал ответ, посмотрим, поможет ли это? - person Niet the Dark Absol; 26.11.2014
comment
да. Идеально. Большое тебе спасибо. - person ptCoder; 26.11.2014
comment
Еще один вопрос: если вы замените тире на символ #, что вы измените в своем коде preg_match_all? - person ptCoder; 26.11.2014
comment
Другого выхода нет? - person ptCoder; 26.11.2014
comment
Что ты имеешь в виду? Зачем тебе другой способ? - person Niet the Dark Absol; 26.11.2014
comment
Потому что у меня один разделен тире, а другой - #. Если я использую замену, это не будет работать правильно, потому что на странице так много символов. Что мне нужно заменить в preg_match_all для работы с #? Спасибо. - person ptCoder; 26.11.2014
comment
Хорошо, хорошо, тогда вы хотите [^-#\n]+[-#] вместо [^-\n]+- - person Niet the Dark Absol; 26.11.2014
comment
Давайте продолжим это обсуждение в чате. - person ptCoder; 26.11.2014

В случае, если в последней из ваших строк указаны годы, вам не нужно регулярное выражение для выполнения этой задачи, как показано ниже:

<?php
$yearsList = array(2013, 2014);
$body = " Text text text ...


Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...";

$arr = explode("\n",$body);
$res = array();
foreach ($arr as $items){
  $itemArr = explode('-', $items);
    foreach ($itemArr as $item){
      if (in_array($item, $yearsList)) $res[] = $items;
    }
}
echo "<pre>";
print_r($res);
?>

Посмотреть этот ДЕМО: http://codepad.org/fdhwEJC4

person SaidbakR    schedule 26.11.2014