PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
mstdmstd
Отправлено: 18 Июля, 2017 - 09:56:53
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Всем привет,
Есть регулярка для разбора текста:

PHP:
скопировать код в буфер обмена
  1. $pattern = '~
  2.        <a[\s]+name="ni(?<news_id>[\d]+)"><h2>(?<news_title>.*)<\/h2><\/a>
  3.        (?:.*)
  4.        <p><small>(?<news_published>[\d\w\s,]+)
  5.        (?:.?)
  6.        \|
  7.        (?:.*)
  8.        <img[\s]+src="(?<news_image>.*)
  9.        "
  10.        (?:.*)
  11.        \/>
  12.        (?<news_content>.*)
  13.        <br[\s]+clear="left"[\s]*\/>
  14.        (?:.*)
  15.        ~isUx'; // result all without pages
  16.  
  17.  

Которая работает для всех статей у которых в статье определена картинка в news_image
Но не все статьи имеют картинки
Чтобы получить и статьи без картинок и чтобы поле news_image оставалось пустым я пытался написаить с условием " или "
PHP:
скопировать код в буфер обмена
  1.         $pattern = '~
  2.                <a[\s]+name="ni(?<news_id>[\d]+)"><h2>(?<news_title>.*)<\/h2><\/a>
  3.                (?:.*)
  4.                <p><small>(?<news_published>[\d\w\s,]+)
  5.                (?:.?)
  6.                \|
  7.                (?:.*)
  8.                (<img[\s]+src="(?<news_image>.*)
  9.                "
  10.                (?:.*)
  11.                \/>|)
  12.                (?<news_content>.*)
  13.                (<br[\s]+clear="left"[\s]*\/>
  14.                (?:.*)
  15.                ~isUx'; // result all without pages
  16.  

Статьи в результате все, но news_image пусты.
А как правильно ?

Спасибо!
 
 Top
Строитель
Отправлено: 18 Июля, 2017 - 14:31:02
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 972
Дата рег-ции: Февр. 2014  


Помог: 33 раз(а)




mstdmstd, насколько мне известно, при использовании альтернативы "|" (или) в результирующий массив будут сохранены так же и пустые "вхождения".

На уровне шаблона рег.выражения в данный момент я не могу сказать, возможно ли избежать пустых элементов. Но можно пойти путём фильтрования результирующих массивов, например с помощью array_filter().
 
 Top
mstdmstd
Отправлено: 19 Июля, 2017 - 10:54:47
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




То есть убирать условие для отбора news_image и делать дополнительный preg_match для каждого элемента
в цикле или с помощью array_filter? Только так?
 
 Top
Строитель
Отправлено: 19 Июля, 2017 - 14:34:50
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 972
Дата рег-ции: Февр. 2014  


Помог: 33 раз(а)




mstdmstd, на счёт ключа "news_image" - если в массиве с этим ключём вообще нет значений, то надо бы переписать шаблон без его использования. А если в этом ключе есть значения, среди которых так же есть и пустые элементы, то чтобы их отфильтровать, достаточно одной строки (без цикла и preg_match)
 
 Top
mstdmstd
Отправлено: 19 Июля, 2017 - 17:51:54
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Сорри, если я непонятно выразился с задачей :
Мне не нужно фильтровать, мне нужно получить ВСЕ строки и в news_image - или ссылка на картинку или пуста или нет такого ключа, но есть сама строка.
 
 Top
Строитель
Отправлено: 19 Июля, 2017 - 17:57:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 972
Дата рег-ции: Февр. 2014  


Помог: 33 раз(а)




mstdmstd, чтобы не ходить кругами, напишите пожалуйста исходный текст, и результат, который надо получить из исходного текста - подумаем вместе.
 
 Top
mstdmstd
Отправлено: 21 Июля, 2017 - 14:35:54
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Выложил пример на http://sandbox.onlinephpfunctions.com/code/b54e7fa3a212804b6df324b0f1f2d16806cfb0b9,
Там текст с 3 блоками текста причем первый блок без картинки и 3 паттерна:
1) получаю 3 блока, но без картинки и картинку нужно выдергивать из 0-го элемента каждой строки результата
2) получаю 2 блока c картинками и 1-я строка пропущена Но тут проблемка в том что в первой результирующей строке заголовок из 1й строки
но картинка и контент из 2й строки
3) Пытаюсь получить 3 строки с картинками( если картинка неопределена поле news_image будет пустым из-за условие “или” )

Понимаю что наверно правильней делать 1й вариант и не заморачиваться - но заинтересовал возможность 3-го варианта. 2 тоже интересно .
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB