Intereting Posts
Как удалить строки из базы данных mysql с помощью php с помощью кнопки удаления формы Каков наилучший способ в PHP или JS расширить сокращенные URL-адреса, такие как Bitly, Tinyurl, чтобы найти исходный URL-адрес? Обновление данных в таблицу из динамически созданного поля ввода Regex pattern – совпадающее слово, которое начинается с @ Изменить расположение php.ini JQuery и PHP Cookies Получить PHP для обновления с каждой строкой, возвращаемой командой оболочки Не удалось открыть поток: Недопустимый аргумент Есть ли класс BigInteger в PHP? facebook graph api возвращает только имя и идентификатор для некоторых веб-сайтов Как передать параметры из командной строки в $ _POST в php-скрипте? PHP mail () отправка только одному получателю Редактирование видео с помощью PHP Как сохранить данные регистрации в двух таблицах с помощью проверки подлинности JWT в CakePHP 3 PHP создает новый сеанс с каждой перезагрузкой

Как игнорировать ссылку http в строке и возвращать все остальное?

Я пытаюсь разобрать некоторый 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 дня. Заранее спасибо!!!

Solutions Collecting From Web of "Как игнорировать ссылку http в строке и возвращать все остальное?"

Описание

Это выражение будет:

  • Захватить заголовок
  • Захват названия события
  • Захват времени события
  • найти все теги шрифтов, которые имеют цвет = золото
  • пропустите слово « Stream если оно существует
  • захватить интересный текст
  • остановить захват, когда он достигнет ссылки http: //
  • Обрезать белое пространство вокруг матчей
  • В целом выражение позволяет атрибутам тега шрифта появляться в любом месте тега шрифта. И выражение будет избегать некоторых действительно трудных краевых случаев

<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]


Объяснение регулярного выражения:

  1. (?:<\/font> ) искать (и игнорировать) первый закрывающий тег шрифта на новой строке, включать пробел
  2. ((?:[^0-9]+(?:[0-9](?!\.|:|[0-9]))?(?:[0-9]{2}(?!\.|:))?)*) захватить все, что не одно или два числа, если за этими числами не следует точка или двоеточие (используйте отрицательный просмотр), повторяйте по мере необходимости и группируйте как один
  3. ([^<]+) хватайте все до следующего «<», но не конечное пространство
  4. <[^>]+> игнорировать все до следующего «>» и игнорировать «>»
  5. (?:Stream )? если первое слово «Stream» игнорирует его
  6. ([^h<]+) захватить все до нижнего регистра "h" или "<"

Описание

Это выражение будет:

  • найти все теги шрифтов, которые имеют класс "gold"
  • пропустите слово « Stream если это первое слово
  • захватить интересный текст
  • остановить захват, когда он достигнет ссылки http: //

<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