Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
1

Проблема с регулярным выражением

15.07.2020, 16:54. Показов 884. Ответов 12

Всем привет. Столкнулся с такой задачей
Нужно отфильтровать контент, удалив из неё картинку
Картинка лежит в тэге <p><a><нужная картинка></a><p> нужно удалить и эти теги.
Написал регулярное выражение, но оно меняет лишь src
Подскажите пожалуйста как исправить выражение чтобы удалялась вся картинка вместе с тегом <p> и <a>
PHP
1
2
3
        $pcre = "~(?:src|srcset|currentSrc)=\"\K[^\"]+" . preg_quote(basename(bloggood_ru_image()), "/") . "~s";
        $repl = '';
        return preg_replace($pcre, $repl, $content);
P.s bloggood_ru_image - это функция, она возвращает url нужной картинки
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2020, 16:54
Ответы с готовыми решениями:

Проблема с регулярным выражением
Здравствуйте дорогие знатоки, есть сайт, на нём есть единая точка входа, эта точка входа написана...

Выбор тегов регулярным выражением
Здравствуйте. Помогите пожалуйста. Есть код: $output .= preg_replace(...

Поиск регулярным выражением
Всем доброго утра. Помогите пожалуйста составить регулярное выражение для поиска такой штуки: ...

Помогите с регулярным выражением
Нжно регулярное выражение, для замены определённых символов, по типу чатов или форумов, где таким...

12
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 17:49 2
Цитата Сообщение от TheTopMisha Посмотреть сообщение
она возвращает url нужной картинки
Давайте-ка сюда минимально воспроизводимый пример, чтоб можно было на локалке запустить ваш код. А то сейчас ваша bloggood_ru_image() никому ничего не говорит, и не понятно, какой именно url она генерит - нужен пример html-кода с картинкой.
0
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
15.07.2020, 18:11  [ТС] 3
Сайт на Wordpress
Есть множество записей, но у них не заданы миниатюры.
Поэтому для вывода всех записей на главной странице, в качестве миниатюры используется первая вложенная картинка внутри записи
Функция выводит первую картинку из записи.
Если у вас есть какой-либо сайт на wordpress, попробуйте вызвать вначале поста
PHP
1
<img src="<?php echo bloggood_ru_image(); ?>" alt="<?php the_title(); ?>"/>
Вот собственно сама функция, прописанная в файле functions,php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Вывод первой картинки с поста
function bloggood_ru_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches); // выдираем первый img
  $first_img = $matches [1] [0];
 
// Если картинка в посте отсутствует, тогда выводим изображение по умолчанию (указать путь и имя к картинке)
  if(empty($first_img)){
   $first_img = "/img/default.jpg";
  }
  return $first_img;
}
0
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 18:19 4
Цитата Сообщение от TheTopMisha Посмотреть сообщение
Если у вас есть какой-либо сайт на wordpress, попробуйте вызвать вначале поста
Такого нету.
Цитата Сообщение от TheTopMisha Посмотреть сообщение
<img src="<?php echo bloggood_ru_image(); ?>" alt="<?php the_title(); ?>"/>
Вот этот тег вы можете у себя скопировать в исходном html-коде, чтобы тут опубликовать?
Цитата Сообщение от TheTopMisha Посмотреть сообщение
Картинка лежит в тэге <p><a><нужная картинка></a><p>
И поясните, почему тогда тег <img src="<?php echo bloggood_ru_image(); ?>" alt="<?php the_title(); ?>"/> находится вне блока <p><a><нужная картинка></a><p>?

Локализуйте вашу проблему, чтобы в итоге можно было понять, что есть на входе, и что должно быть в результате обработки.
0
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
15.07.2020, 18:36  [ТС] 5
Пожалуйста, не обращайте внимания на функцию bloggood_ru_image(), она работает исправно
На выходе получается вот такой URL: http://qwerty/wp-content/uploa... search.jpg

Вот html код

HTML5
1
2
3
4
5
6
7
8
9
<p>
      <a href="http://qwerty/2020/03/onlyoffice-and-elasticsearch-better-and-faster-navigation-through-documents-emails-and-other- 
      content/"><img class="alignnone size-full wp-image-14915" src="http://qwerty/wp- 
      content/uploads/2020/03/Blog_elasticsearch.jpg" alt="Elasticsearch, ONNLYOFFICE, search engine, integration" 
      width="634" height="320" srcset="  634w, http://qwerty/wp-content/uploads/2020/02/Blog_elasticsearch-300x151.jpg 300w" 
      sizes="(max-width: 634px) 100vw, 634px" />
      </a><br />
      <span id="more-14903"></span>
</p>
Задача состоит в том, чтобы с помощью регулярного выражения найти img с src=http://qwerty/wp-content/uploads/2020/03/Blog_elasticsearch.jpg и удалить всё вместе с <p> чтобы ничего не осталось.
0
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 19:09 6
Лучший ответ Сообщение было отмечено TheTopMisha как решение

Решение

TheTopMisha,
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$str = '<p>
      <a href="http://qwerty/2020/03/onlyoffice-and-elasticsearch-better-and-faster-navigation-through-documents-emails-and-other- 
      content/"><img class="alignnone size-full wp-image-14915" src="http://qwerty/wp-content/uploads/2020/03/Blog_elasticsearch.jpg" alt="Elasticsearch, ONNLYOFFICE, search engine, integration" 
      width="634" height="320" srcset="  634w, http://qwerty/wp-content/uploads/2020/02/Blog_elasticsearch-300x151.jpg 300w" 
      sizes="(max-width: 634px) 100vw, 634px" />
      </a><br />
      <span id="more-14903"></span>
</p>
<p>
      <a href="http://qwerty/2020/03/onlyoffice-and-elasticsearch-better-and-faster-navigation-through-documents-emails-and-other- 
      content/"><img class="alignnone size-full wp-image-14915" src="http://qwerty/wp-content/uploads/2020/03/BlaBla.jpg" alt="Elasticsearch, ONNLYOFFICE, search engine, integration" 
      width="634" height="320" srcset="  634w, http://qwerty/wp-content/uploads/2020/02/Blog_elasticsearch-300x151.jpg 300w" 
      sizes="(max-width: 634px) 100vw, 634px" />
      </a><br />
      <span id="more-14903"></span>
</p>';
 
$url = 'http://qwerty/wp-content/uploads/2020/03/Blog_elasticsearch.jpg';
 
$pattern = '~<p[^>]*>\s*<a[^>]*><img[^>]*'. preg_quote($url, '~') .'[^>]*/?>.*?</p>~s';
 
$str = preg_replace($pattern, '', $str);
 
print_r( $str );
Но помните - html не стоит парсить регулярками.
1
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
15.07.2020, 19:58  [ТС] 7
Большое спасибо. Это именно то, что нужно! Мне очень помогло. Я целый день убил на изучение регулярных выражений php

Добавлено через 54 секунды
Строитель, Обнаружил один недостаток, тэг <p> не удаляется, внутри него остается <span>
Пожалуйста, подскажите как исправить регулярку, чтобы и <p> и <span> тоже удалить?
0
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 20:17 8
Цитата Сообщение от TheTopMisha Посмотреть сообщение
тэг <p> не удаляется, внутри него остается <span>
В этом конкретно примере всё удаляется корректно: см. демо.
1
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
15.07.2020, 22:04  [ТС] 9
Строитель, да, Вы правы. Я ошибся, извините меня. Большое спасибо за помощь.
Разрешите если я попробую расшифровать каждый символ, а Вы меня поправьте. Очень долго пришлось разбираться

Исходное выражение '~<p[^>]*>\s*<a[^>]*><img[^>]*'. preg_quote($url, '~') .'[^>]*/?>.*?</p>~s';

'~ - символ-ограничитель, с него начинается любое выражение, так же можно использовать "/"
<p - начало тэга
[^>] - любой символ кроме ">"
* - не важно сколько символов между началом тега "<p" и концом тега ">"
> - конец тэга
\s - один пробел
* - не важно сколько много пробелов
<a - начало тэга
[^>] - любой символ кроме ">"
* - не важно сколько символов между началом тега "<a" и концом тега ">"
> - конец тэга
<img - начало тэга
[^>] - любой символ кроме ">"
* не важно сколько символов между началом тега "<img" и концом тега ">"
'. preg_quote - добавляет обратный слеш перед каждым служебным символом, используется для использования динамически изменяемых переменных
($url - это динамически изменяемая переменная
, '~') .' - вторая переменная но не понимаю почему она здесь
[^>] - любой символ кроме ">"
* - не понятно
/?> - идущий перед знаком вопроса символ "/" может встретиться а может и нет
.*? - тоже не понятно
</p> - конец тега p но не понятно зачем здесь ещё один конец тега
~ - конец всего выражения
s'; - модификатор s, означает однострочная строка
0
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 23:19 10
Цитата Сообщение от TheTopMisha Посмотреть сообщение
</p> - конец тега p но не понятно зачем здесь ещё один конец тега
Почему ещё один? - он тут один, закрывающий.
Цитата Сообщение от TheTopMisha Посмотреть сообщение
($url - это динамически изменяемая переменная
, '~') .' - вторая переменная но не понимаю почему она здесь
Вторым аргументом в функцию preg_quote() передаются символы, которые не являются служебными с точки зрения регулярных выражений, но которые так же подлежат экранированию. В этом конкретном случае, если не передавать вторым параметром символ тильды '~', то механизм регулярных выражений, дойдя до этой тильды, сочтёт её вторым закрывающим ограничителем шаблона, и в результате будет брошена ошибка.

Ну а всё остальное вам вроде бы понятно.
1
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
15.07.2020, 23:53  [ТС] 11
Строитель, большое спасибо за разъяснение.
Скажите пожалуйста, почему после открывающего тега <p[^>]*> идёт \s* - сколько-либо пробелов
А после открывающего <a[^>]*> и <img[^>] этого \s* уже нет
И ещё, маленький вопрос, тэг <a[^>]*> не нужно закрывать в регулярных выражениях?
То есть перед </p> почему не надо ставить </a>?
0
1029 / 708 / 342
Регистрация: 09.07.2018
Сообщений: 1,694
15.07.2020, 23:59 12
Цитата Сообщение от TheTopMisha Посмотреть сообщение
почему после открывающего тега <p[^>]*> идёт \s* - сколько-либо пробелов
А после открывающего <a[^>]*> и <img[^>] этого \s* уже нет
Ну в вашем html-коде ведь нету \s после после открывающего <a>, потому и в шаблоне я его не предусмотрел.
Цитата Сообщение от TheTopMisha Посмотреть сообщение
тэг <a[^>]*> не нужно закрывать в регулярных выражениях?
Это зависит от того, что нужно искать: в вашем случае важен закрывающий тег параграфа, поэтому тег </a> можно опустить.
1
1 / 1 / 0
Регистрация: 28.09.2019
Сообщений: 49
16.07.2020, 14:16  [ТС] 13
Строитель, извините за такое количество вопросов.
Предложенное Вами решение работает, и за это большое спасибо
Но я хочу доработать регулярное выражение
Сейчас оно удаляет любую img

То есть, если в переменной $str у img будет src другой, например
http://qwerty/2020/03/1203947851293801283.jpg

А в переменной
$url = 'http://qwerty/wp-content/uploads/2020/03/Blog_elasticsearch.jpg';

То регулярное выражение всё равно его удалит, даже если src не совпадает с $url

Как сделать так, чтобы например есть переменная
$url = "http://qwerty/wp-content/uploads/2020/02/onlyoffice_mwc_barcelona-1.jpg"

и есть картинка у которой
scr = "http://qwerty/wp-content/uploads/2020/02/onlyoffice_mwc_barcelona.jpg"

нужно чтобы удалялась именно та img у который src=$url, но как вы видите они немного отличаются
то есть с конца могут не совпадать приблизительно 5 символов

Как реализовать такое?


Вставлю пример
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$str = 
'<p>
      <a href="http://qwerty/2020/03/onlyoffice-and-elasticsearch-better-and-faster-navigation-through-documents-emails-and-other- 
      content/"><img class="alignnone size-full wp-image-14915" src="http://qwerty/wp-content/uploads/2020/02/onlyoffice_mwc_barcelona.jpg" alt="Elasticsearch, ONNLYOFFICE, search engine, integration" 
      width="634" height="320" srcset="  634w, http://qwerty/wp-content/uploads/2020/02/Blog_elasticsearch-300x151.jpg 300w" 
      sizes="(max-width: 634px) 100vw, 634px" />
      </a><br />
      <span id="more-14903"></span>
</p>;
 
 
$url = 'http://qwerty/wp-content/uploads/2020/02/onlyoffice_mwc_barcelona-1.jpg';
 
$pattern = '~<p[^>]*>\s*<a[^>]*><img[^>]*'. preg_quote($url, '~') .'[^>]*/?>.*?</p>~s';
 
$str = preg_replace($pattern, '', $str);
 
print_r( $str );
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2020, 14:16

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Помогите с регулярным выражением
Имеется данный исходный текст, мне нужно из него выдрать по порядку значения полей &quot;Родился&quot;,...

Помогите с регулярным выражением
Доброго времяни суток! Помогите написать регулярное выражение, ищу определённый текст на сайте....

Определение ссылки регулярным выражением
Всем привет. Необходима помощь в написании двух регулярных выражений. 1. &lt;a class=&quot;btn...

Не могу разобратся с Регулярным выражением
Не могу разобратся с Регулярным выражением Надо то что между тегами &lt;span&gt;&lt;/span&gt; &lt;p...

Редактирование массива регулярным выражением
Добрый день! Выбираю из базы сайта все короткие новости(short_story) через цикл, при этом...

Проверка логина регулярным выражением
Валидные логины, например: a-a, a00, aaa-a, a_a, aaa, aaa0000-a, a-a-a, a-a_a Невалидные логины,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.