2016-04-28 5 views
2

У меня есть сценарий, который просматривает последнюю строку файла журнала в реальном времени. Когда появится следующая строка. Я хочу извлечь данные во второй набор скобок. Мой исходный код работал нормально, проблема в том, что выход журнала изменился. Пример вывода журнала:Анализ синтаксического анализа данных с использованием Regex

2016-04-28 16:54:49  INFO [ADMINCGI sid=1] Title updated [Peezy - Dope Fein Baby (Feat. TID Sweeze & H.N.I.C Pesh)] 
2016-04-28 16:54:49  INFO [ADMINCGI sid=1] DJ name updated [1] 

мне нужно сначала убедиться, что линия в вопросе линии № 1 является найденная строка, а затем извлечь текст внутри второй скобки, если это возможно.

Я использую это, но она возвращается на # 2 линии

Мой код:

$line ="2016-04-27 22:56:48  INFO [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]"; 
echo $line; 

$pattern="/\[([^\]]*)\]/"; 

$needle = " Title updated "; 
if (strpos($line,$needle) !== false) { 
preg_match_all($pattern, $line, $matches); 
foreach ($matches[1] as $a){ 

    // echo $a."</br>"; 
    // echo $matches[1][1]; 
    $fulltitle = explode("-", $matches[1][1]); 

    $artist = $fulltitle[0]; 
    $title = $fulltitle[1]; 
    echo $artist; 
+0

Почему вы выполняете итерацию массива при непосредственном доступе к записи? Может быть, я беспокоюсь о многом, потому что многие онлайн-тестер регулярных выражений могут помочь вам протестировать ваш шаблон. http://www.regexr.com/ для примера. – SmasherHell

+1

Если вы проверите каждую строку отдельно, попробуйте использовать ['preg_match_all ('~ \ [([^] [] *)] ~', $ input, $ m); $ my_val = $ m [1] [1]; '] (http://ideone.com/jAwAKe) –

+0

@ BuzzzHost.com: Любая обратная связь? Есть ли какое-нибудь предложение для вас? –

ответ

1

Я бы с помощью функции strrpos(), потому что главная линия гораздо проще отлаживать, чем это регулярное выражение

<?php 
$line ="2016-04-27 22:56:48  INFO [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]"; 
echo $line; 

$match = rtrim(substr($line, strrpos($line, '[') + 1), "]"); 

$fulltitle = explode("-", $match); 

$artist = $fulltitle[0]; 
$title = $fulltitle[1]; 
echo $artist; 

?> 
+1

Спасибо за ответы :) –

+0

Последнее, спасибо за отзыв. Это работает, и он смог извлечь «Исполнитель» и «Название песни» без проблем. Проблема в том, что скрипт работает непрерывно, и мне нужно, чтобы он срабатывал только при изменении песни. Каждый раз, когда песня меняется, эта строка появляется в журналах, за исключением другого исполнителя и названия. У меня было это, где каждый раз, когда песня меняется, она создает твит и отправляет ее в Twitter. Это работает, но то, что происходит, это то, что он держит твиты без остановок. Он должен делать это только один раз за смену песни. –

+0

2016-04-28 21:39:12 INFO [ADMINCGI sid = 1] Название обновлено [Kevin Gates - Making Love (DatPiff Exclusive)] 2016-04-28 21:39:12 INFO [ADMINCGI sid = 1] DJ имя изменено [1] Сразу после изменения песни выводится вторая строка выше. Регулярное выражение пытается вытащить данные из этой строки из-за [1], я полагаю. Мне нужен способ специально взять только название песни Artist Ad Song и игнорировать все остальное. Я не самый лучший из этих вещей, поэтому я извиняюсь, но мне нужен код, чтобы сказать, найти что-нибудь внутри [], ограниченное гипнозом. Это единственное различие между двумя строками, о которых я могу думать. –

Смежные вопросы