Описание
Это регулярное выражение найдет заголовок каждого раздела Twitter Mentions - Count
и захватит тело раздела в группу 1.
^\#\sTwitter\s:\sMentions\s-\sCount,[\s\r\n]+ # match the header
^\#\s----------------------------------------,[\s\r\n]+ # match the separator line
(^(?:(?!\#\s\*\*\*\sInterval:\sDaily\s\*\*\*,).)*) # match the rest of the string upto the first Interval Daily
Расширенный
Этот первый раздел просто находит начало каждого блока, в нем много символов, но он в основном прямолинеен.
^
match the start of a line, requires the of the multiline option which is usually m
\#\sTwitter\s:\sMentions\s-\sCount,
соответствует этой точной строке, обратите внимание, что \s
будет соответствовать символу пробела, я делаю это, потому что мне нравится использовать параметр игнорирования пробела, который обычно равен x
[\s\r\n]+
соответствует одному или нескольким пробелам или символам новой строки.
^\#\s----------------------------------------,[\s\r\n]+
Это соответствует символам в строке-разделителе от начала строки ^
до символа новой строки в конце
Этот раздел отражает основную часть раздела, и именно здесь происходит настоящее волшебство.
(
Start the capture group 1
^
убедитесь, что мы совпали с началом строки. Это гарантирует правильную проверку следующего просмотра вперед
(?:
начать группу без захвата. Конструкция этой группы без захвата является самозавершающейся, когда она встречает нежелательную строку внутри отрицательного просмотра вперед. Это приведет к захвату каждого символа между заголовком раздела выше и конечной строкой.
(?!
начать отрицательный просмотр вперед, это подтвердит, что мы не попадаем в нежелательный закрытый текст, который отмечает конец раздела.
\#\s\*\*\*\sInterval:\sDaily\s\*\*\*,
соответствует нежелательному тексту. Если это найдено, то отрицательный просмотр не удастся
)
закрыть негативный взгляд вперед
.
соответствует любому символу, ожидается, что опция «точка соответствует новой строке» обычно s
.
)
закрыть группу без захвата
*
разрешить группе без захвата повторяться ноль или более раз.
)
закрыть группу захвата 1. Поскольку все, что произошло внутри этой группы захвата, все совпадающие .
будут храниться здесь.
Пример PHP
Живой пример: http://www.rubular.com/r/stgaiBeSE1
Образец текста
***Client Name: abc***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),abc
6/6/2013,1
6/11/2013,3
6/12/2013,2
6/13/2013,1
6/14/2013,2
6/15/2013,4
6/17/2013,4
6/18/2013,8
6/19/2013,7
# *** Interval: Daily ***,
,
***Client Name: abc***,
,
# ----------------------------------------,
# Facebook Insights : Likes by Source,
# ----------------------------------------,
Sources,Likes
Mobile,3602
Page Profile,470
Recommended Pages,86
Ads,64
Like Story,49
Mobile Sponsored Page You May Like,44
Page Browser,33
Search,22
Timeline,16
Mobile Page Suggestions On Liking,15
3 more sources,48
,
***Client Name: xyz***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),xyz
6/12/2013,1
# *** Interval: Daily ***,
,
***Client Name: pqr***,
,
# ----------------------------------------,
# Twitter : Mentions - Count,
# ----------------------------------------,
Date/Time (GMT),pqr
6/6/2013,2
6/7/2013,3
6/9/2013,6
6/10/2013,1
6/12/2013,4
6/13/2013,1
6/14/2013,9
6/15/2013,5
6/16/2013,1
6/18/2013,2
6/19/2013,2
# *** Interval: Daily ***,
Код
<?php
$sourcestring="your source string";
preg_match_all('/^\#\sTwitter\s:\sMentions\s-\sCount,[\s\r\n]+
^\#\s----------------------------------------,[\s\r\n]+
(^(?:(?!\#\s\*\*\*\sInterval:\sDaily\s\*\*\*,).)*)/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
Совпадения из группы захвата 1
[0] => Date/Time (GMT),abc
6/6/2013,1
6/11/2013,3
6/12/2013,2
6/13/2013,1
6/14/2013,2
6/15/2013,4
6/17/2013,4
6/18/2013,8
6/19/2013,7
[1] => Date/Time (GMT),xyz
6/12/2013,1
[2] => Date/Time (GMT),pqr
6/6/2013,2
6/7/2013,3
6/9/2013,6
6/10/2013,1
6/12/2013,4
6/13/2013,1
6/14/2013,9
6/15/2013,5
6/16/2013,1
6/18/2013,2
6/19/2013,2
)
person
Ro Yo Mi
schedule
04.07.2013