Я пытаюсь разобрать некоторый html-контент, вот HTML-контент:
<font color="green"> *TITLE* </font> Some Event Name 1:15pm-5:00pm <font color="gold">Stream 5</font><p> <font color="green"> *TITLE* </font> Some: Event Name 1:30pm-5:00pm <font color="gold">Stream 4</font><p> <font color="green"> *TITLE* </font> Some, Event Name 1 with num 1:30pm-7:30pm <font color="gold">CHANNEL TWO 2 STREAM http://http://domain.com/path/to/page-2-online.html</font><p> <font color="green"> *TITLE* </font> Event two 2.45pm-4.45pm <font color="gold">Stream 16</font><p> <font color="green"> *TITLE* </font> Event THREE summary 2.45pm-4.45pm <font color="gold">Stream 2</font><p> <font color="green"> *TITLE* </font> Event with a lot of summary 4:00pm-6:00pm <font color="gold">CHANNEL THREE 3 STREAM http://domain.com/path/to/page-3-online.html</font><p>
Поэтому, чтобы разобрать это и получить «Имя события», «Время события» и «Номер потока», я делаю это:
preg_match_all('/<\/font>\s*([^<]+)\s+(\d+.\d+\s*\w{2}\s*-\s*\d+.\d+\s*\w{2}).*?tream\s*(.*?)\s*<\/font><p>/', $data, $matches);
И он возвращает все правильно, однако также возвращается номер потока с http-ссылкой, которую я не хочу. Я просто хочу имя (Только для некоторых) и только номер.
Необходимые данные:
5 4 CHANNEL TWO 2 STREAM 16 2 CHANNEL THREE 3 STREAM
В настоящее время он возвращает:
5 4 -online.html 16 2 -online.html
Кто-нибудь может помочь? Не про в regex, пробовал последние 2 дня. Заранее спасибо!!!
Это выражение будет:
Stream
если оно существует <font(?=\s|>)(?=(?:[^>=|&)]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\scolor=['"]?green['"]?)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>\s*(?:Stream\s*)?((?:(?!<\/font>).)*)<\/font>\s*[^<]*?([^<]+)\s+(\d+.\d+\s*\w{2}\s*-\s*\d+.\d+\s*\w{2})[^<]*?<font(?=\s|>)(?=(?:[^>=|&)]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\scolor=['"]?gold['"]?)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>(?:Stream\s*)?((?:(?!\s*https?:|<\/font>).)*)
Демо-версия
Образец текста
Группа 0 получает весь матч
Группа 1 получает титул
Группа 2 получает название мероприятия
Группа 3 получает время события
Группа 4 получает номер потока
<font color="green"> *TITLE* </font> Some Event Name 1:15pm-5:00pm <font color="gold">Stream 5</font><p> <font color="green"> *TITLE* </font> Some: Event Name 1:30pm-5:00pm <font color="gold">Stream 4</font><p> <font color="green"> *TITLE* </font> Some, Event Name 1 with num 1:30pm-7:30pm <font color="gold">CHANNEL TWO 2 STREAM http://http://domain.com/path/to/page-2-online.html</font><p> <font color="green"> *TITLE* </font> Event two 2.45pm-4.45pm <font color="gold">Stream 16</font><p> <font color="green"> *TITLE* </font> Event THREE summary 2.45pm-4.45pm <font color="gold">Stream 2</font><p> <font color="green"> *TITLE* </font> Event with a lot of summary 4:00pm-6:00pm <font color="gold">CHANNEL THREE 3 STREAM http://domain.com/path/to/page-3-online.html</font><p>
Пример кода PHP
<?php $sourcestring="your source string"; preg_match_all('/<font(?=\s|>)(?=(?:[^>=|&)]*|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\scolor=[\'"]?green[\'"]?)(?:[^>=|&)]|=\'(?:[^\']|\\')*\'|="(?:[^"]|\\")*"|=[^\'"][^\s>]*)*>\s*(?:Stream\s*)?((?:(?!<\/font>).)*)<\/font>\s*[^<]*?([^<]+)\s+(\d+.\d+\s*\w{2}\s*-\s*\d+.\d+\s*\w{2})[^<]*?<font(?=\s|>)(?=(?:[^>=|&)]*|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\scolor=[\'"]?gold[\'"]?)(?:[^>=|&)]|=\'(?:[^\']|\\')*\'|="(?:[^"]|\\")*"|=[^\'"][^\s>]*)*>(?:Stream\s*)?((?:(?!\s*https?:|<\/font>).)*) /imsx',$sourcestring,$matches); echo "<pre>".print_r($matches,true); ?>
Матчи
[0][0] = <font color="green"> *TITLE* </font> Some Event Name 1:15pm-5:00pm <font color="gold">Stream 5 [0][1] = *TITLE* [0][2] = Some Event Name [0][3] = 1:15pm-5:00pm [0][4] = 5 [1][0] = <font color="green"> *TITLE* </font> Some: Event Name 1:30pm-5:00pm <font color="gold">Stream 4 [1][1] = *TITLE* [1][2] = Some: Event Name [1][3] = 1:30pm-5:00pm [1][4] = 4 [2][0] = <font color="green"> *TITLE* </font> Some, Event Name 1 with num 1:30pm-7:30pm <font color="gold">CHANNEL TWO 2 STREAM [2][1] = *TITLE* [2][2] = Some, Event Name 1 with num [2][3] = 1:30pm-7:30pm [2][4] = CHANNEL TWO 2 STREAM [3][0] = <font color="green"> *TITLE* </font> Event two 2.45pm-4.45pm <font color="gold">Stream 16 [3][1] = *TITLE* [3][2] = Event two [3][3] = 2.45pm-4.45pm [3][4] = 16 [4][0] = <font color="green"> *TITLE* </font> Event THREE summary 2.45pm-4.45pm <font color="gold">Stream 2 [4][1] = *TITLE* [4][2] = Event THREE summary [4][3] = 2.45pm-4.45pm [4][4] = 2 [5][0] = <font color="green"> *TITLE* </font> Event with a lot of summary 4:00pm-6:00pm <font color="gold">CHANNEL THREE 3 STREAM [5][1] = *TITLE* [5][2] = Event with a lot of summary [5][3] = 4:00pm-6:00pm [5][4] = CHANNEL THREE 3 STREAM
Но, если вы хотите его в regex, тогда на основе ваших данных вам понадобится это
preg_match_all('/(?:<\/font> )((?:[^0-9]+(?:[0-9](?!\.|:|[0-9]))?(?:[0-9]{2}(?!\.|:))?)*)([^<]+) <[^>]+>(?:Stream )?([^h<]+)/', $data, $matches);
Это поместит имена в $matches[1]
, время в $matches[2]
и каналы в $matches[3]
Объяснение регулярного выражения:
(?:<\/font> )
искать (и игнорировать) первый закрывающий тег шрифта на новой строке, включать пробел ((?:[^0-9]+(?:[0-9](?!\.|:|[0-9]))?(?:[0-9]{2}(?!\.|:))?)*)
захватить все, что не одно или два числа, если за этими числами не следует точка или двоеточие (используйте отрицательный просмотр), повторяйте по мере необходимости и группируйте как один ([^<]+)
хватайте все до следующего «<», но не конечное пространство <[^>]+>
игнорировать все до следующего «>» и игнорировать «>» (?:Stream )?
если первое слово «Stream» игнорирует его ([^h<]+)
захватить все до нижнего регистра "h" или "<" Это выражение будет:
Stream
если это первое слово <font(?=\s|>)(?=(?:[^>=|&)]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\scolor=['"]?gold['"]?)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>(?:Stream\s*)?\K(?:(?!\s*https?:|<\/font>).)*
Live Demo наведите указатель мыши на синие блоки, чтобы понять, почему они были сопоставлены
Образец текста
<font color="green"> *TITLE* </font> Some Event Name 1:15pm-5:00pm <font color="gold">Stream 5</font><p> <font color="green"> *TITLE* </font> Some: Event Name 1:30pm-5:00pm <font color="gold">Stream 4</font><p> <font color="green"> *TITLE* </font> Some, Event Name 1 with num 1:30pm-7:30pm <font color="gold">CHANNEL TWO 2 STREAM http://http://domain.com/path/to/page-2-online.html</font><p> <font color="green"> *TITLE* </font> Event two 2.45pm-4.45pm <font color="gold">Stream 16</font><p> <font color="green"> *TITLE* </font> Event THREE summary 2.45pm-4.45pm <font color="gold">Stream 2</font><p> <font color="green"> *TITLE* </font> Event with a lot of summary 4:00pm-6:00pm <font color="gold">CHANNEL THREE 3 STREAM http://domain.com/path/to/page-3-online.html</font><p>
Матчи
[0] => 5 [1] => 4 [2] => CHANNEL TWO 2 STREAM [3] => 16 [4] => 2 [5] => CHANNEL THREE 3 STREAM