Форумы портала PHP.SU » PHP » Регулярные выражения » Получить статьи с пустой картинкой

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

1. mstdmstd - 18 Июля, 2017 - 09:56:53 - перейти к сообщению
Всем привет,
Есть регулярка для разбора текста:

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 пусты.
А как правильно ?

Спасибо!
2. Строитель - 18 Июля, 2017 - 14:31:02 - перейти к сообщению
mstdmstd, насколько мне известно, при использовании альтернативы "|" (или) в результирующий массив будут сохранены так же и пустые "вхождения".

На уровне шаблона рег.выражения в данный момент я не могу сказать, возможно ли избежать пустых элементов. Но можно пойти путём фильтрования результирующих массивов, например с помощью array_filter().
3. mstdmstd - 19 Июля, 2017 - 10:54:47 - перейти к сообщению
То есть убирать условие для отбора news_image и делать дополнительный preg_match для каждого элемента
в цикле или с помощью array_filter? Только так?
4. Строитель - 19 Июля, 2017 - 14:34:50 - перейти к сообщению
mstdmstd, на счёт ключа "news_image" - если в массиве с этим ключём вообще нет значений, то надо бы переписать шаблон без его использования. А если в этом ключе есть значения, среди которых так же есть и пустые элементы, то чтобы их отфильтровать, достаточно одной строки (без цикла и preg_match)
5. mstdmstd - 19 Июля, 2017 - 17:51:54 - перейти к сообщению
Сорри, если я непонятно выразился с задачей :
Мне не нужно фильтровать, мне нужно получить ВСЕ строки и в news_image - или ссылка на картинку или пуста или нет такого ключа, но есть сама строка.
6. Строитель - 19 Июля, 2017 - 17:57:53 - перейти к сообщению
mstdmstd, чтобы не ходить кругами, напишите пожалуйста исходный текст, и результат, который надо получить из исходного текста - подумаем вместе.
7. mstdmstd - 21 Июля, 2017 - 14:35:54 - перейти к сообщению
Выложил пример на http://sandbox.onlinephpfunctions.com/code/b54e7fa3a212804b6df324b0f1f2d16806cfb0b9,
Там текст с 3 блоками текста причем первый блок без картинки и 3 паттерна:
1) получаю 3 блока, но без картинки и картинку нужно выдергивать из 0-го элемента каждой строки результата
2) получаю 2 блока c картинками и 1-я строка пропущена Но тут проблемка в том что в первой результирующей строке заголовок из 1й строки
но картинка и контент из 2й строки
3) Пытаюсь получить 3 строки с картинками( если картинка неопределена поле news_image будет пустым из-за условие “или” )

Понимаю что наверно правильней делать 1й вариант и не заморачиваться - но заинтересовал возможность 3-го варианта. 2 тоже интересно .

 

Powered by ExBB FM 1.0 RC1