PHP.SU

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

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

> Найдено сообщений: 37
bellagio Отправлено: 11 Апреля, 2017 - 20:55:39 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель пишет:
вам нужно получить такой исходный код?

Да
bellagio Отправлено: 11 Апреля, 2017 - 10:40:58 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Текст стандартный, единственное, это вставки ссылок на видео и на картинки по шаблону для которого делаем код. Ну а сам редактор tinymce расставляет абзац к тексту и ссылкам. Пример текста:
Спойлер (Отобразить)


Строитель пишет:
А чем вас не устраивает этот вариант?

в коде страницы появляется лишние теги абзаца </p> то есть картинка может выглядеть так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <iframe style="display: block; margin-left: auto; margin-right: auto;" src="https://www.youtube.com/embed/rC9OnOWJnY4</p>" width="500" frameborder="0" height="375"></iframe>

или появиться в:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <img src="foto/1.jpg" alt="летний пейзаж</p>">

А также, если открыть код страницы у видео остается неудаленный тег <p> перед видео:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <p><iframe style="display: block; margin-left: auto; margin-right: auto;" src="https://www.youtube.com/embed/rC9OnOWJnY4" frameborder="0" width="500" height="375"></iframe>
bellagio Отправлено: 10 Апреля, 2017 - 20:00:50 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Проблема актуальна с конечным </p> в особенности для видео. Пример кода выше.
bellagio Отправлено: 10 Апреля, 2017 - 09:26:25 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Да, я немного два первых варианта поправил.

А вчера когда тестировали, смотрели в исходном тексте страницы, лишних тегов не было?
bellagio Отправлено: 10 Апреля, 2017 - 09:00:26 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель пишет:
Вы добавили теги параграфа к остальным картинкам?

Я имею ввиду, что первый тег <p> убирается, а конечный </p> нет. Так и у картинок и у видео. Это при текущей реализации кода
bellagio Отправлено: 10 Апреля, 2017 - 07:44:25 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
дополнил:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     $input = '
  2.     Тут вступление повествующее о необходимости увидеть этот летний пейзаж именно в этом году.
  3.     foto/1.jpg=картинка про лето+летний пейзаж
  4.     foto/2.jpg=картинка про лето
  5.     Тут летний пейзаж заканчивается и хочется пожелать...
  6.      
  7.     <p>foto/3.jpg</p>
  8.      
  9.     foto/4.jpg=картинка про лето+летний пейзаж
  10.     Ну и напоследок советую посмотреть видео ролик:
  11.     <p>https://www.youtube.com/watch?v=rC9OnOWJnY4</p>
  12.     ';
  13.      
  14.     echo parseTagsRecursive($input);
  15.      
  16.     function parseTagsRecursive($input) {
  17.         return preg_replace_callback(
  18.             [
  19.                 '~.*foto/(.+).*~iu',
  20.                 '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i'
  21.            ],
  22.            function ($m) {
  23.               if ( preg_match('~foto/(.+)=(.+)\+(.+)~iu', $m[0]) ) {
  24.                   $pattern = '~.*foto/(.+)=(.+)\+(.+)</p>~iu';
  25.                     $replace = '<div class="wp-caption aligncenter">'.
  26.                         '<img src="foto/$1" alt="$3" />'.
  27.                         '<div class="wp-caption-text">$2</div></div>';
  28.                 } elseif ( preg_match('~foto/(.+)=(.+)~iu', $m[0]) ) {
  29.                     $pattern = '~.*foto/(.+)=(.+)</p>~iu';
  30.                     $replace = '<div class="wp-caption aligncenter">'.
  31.                         '<img src="foto/$1" alt="$2" />'.
  32.                         '<div class="wp-caption-text">$2</div></div>';
  33.                 } elseif ( preg_match('~foto/(.+)~iu', $m[0]) ) {
  34.                     $pattern = '~.*foto/(.+)</p>~iu';
  35.                     $replace = '<div class="wp-caption_one aligncenter">'.
  36.                         '<img src="foto/$1" alt="" /></div>';
  37.                 } elseif ( preg_match('~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i', $m[0]) ) {
  38.                   $pattern = '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i';
  39.                     $replace = '<iframe style="display: block; margin-left: auto; margin-right: auto;" src="https://www.youtube.com/embed/$2" frameborder="0" width="500" height="375"></iframe>';
  40.                 }
  41.      
  42.                 return preg_replace($pattern, $replace, $m[0]);
  43.             },
  44.             $input
  45.         );
  46.     }

Все вырезает, кроме тега <p> перед видео. Таким же способом, что и для картинок не вариант.

Кроме того, дополнив код - var_dump($m); и посмотрев исходный код страницы получаем:
PHP:
скопировать код в буфер обмена
  1. array(2) {
  2.   [0]=>
  3.   string(78) "<p>foto/1.jpg=картинка про лето+летний пейзаж</p>
  4. "
  5.   [1]=>
  6.   string(69) "1.jpg=картинка про лето+летний пейзаж</p>
  7. "
  8. }
  9. array(2) {
  10.   [0]=>
  11.   string(52) "<p>foto/2.jpg=картинка про лето</p>
  12. "
  13.   [1]=>
  14.   string(43) "2.jpg=картинка про лето</p>
  15. "
  16. }
  17. array(2) {
  18.   [0]=>
  19.   string(19) "<p>foto/3.jpg</p>
  20. "
  21.   [1]=>
  22.   string(10) "3.jpg</p>
  23. "
  24. }
  25. array(2) {
  26.   [0]=>
  27.   string(78) "<p>foto/4.jpg=картинка про лето+летний пейзаж</p>
  28. "
  29.   [1]=>
  30.   string(69) "4.jpg=картинка про лето+летний пейзаж</p>
  31. "
  32. }
  33. array(3) {
  34.   [0]=>
  35.   string(47) "https://www.youtube.com/watch?v=rC9OnOWJnY4</p>"
  36.   [1]=>
  37.   string(4) "www."
  38.   [2]=>
  39.   string(15) "rC9OnOWJnY4</p>"
  40. }

получается, что конечный тег </p> еще цепляется. А хотя визуально картинки выводятся нормально. или я чего-то недопонимаю?
bellagio Отправлено: 09 Апреля, 2017 - 22:03:42 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Сделал так:
PHP:
скопировать код в буфер обмена
  1.         $input = '
  2.        Тут вступление повествующее о необходимости увидеть этот летний пейзаж именно в этом году.
  3.        foto/1.png=картинка про лето+летний пейзаж
  4.        foto/2.png=картинка про лето
  5.        Тут летний пейзаж заканчивается и хочется пожелать...
  6.        
  7.        <p>foto/3.png</p>
  8.        
  9.        foto/1.png=картинка про лето+летний пейзаж
  10.        Ну и напоследок советую посмотреть видео ролик:
  11.        https://www.youtube.com/watch?v=rC9OnOWJnY4
  12.        ';
  13.          
  14.         echo parseTagsRecursive($input);
  15.          
  16.         function parseTagsRecursive($input) {
  17.             return preg_replace_callback(
  18.                 [
  19.                     '~foto/(.+)~iu',
  20.                     '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i'
  21.                ],
  22.                function ($m) {
  23.                    if ( preg_match('~foto/(.+)=(.+)\+(.+)</p>~iu', $m[0]) ) {
  24.                        $pattern = '~foto/(.+)=(.+)\+(.+)</p>~iu';
  25.                         $replace = '<div class="wp-caption aligncenter">'.
  26.                             '<img src="foto/$1" alt="$3" />'.
  27.                             '<div class="wp-caption-text">$2</div></div>';
  28.                     } elseif ( preg_match('~foto/(.+)=(.+)</p>~iu', $m[0]) ) {
  29.                         $pattern = '~foto/(.+)=(.+)</p>~iu';
  30.                         $replace = '<div class="wp-caption aligncenter">'.
  31.                             '<img src="foto/$1" alt="$2" />'.
  32.                             '<div class="wp-caption-text">$2</div></div>';
  33.                     } elseif ( preg_match('~foto/(.+)</p>~iu', $m[0]) ) {
  34.                         $pattern = '~foto/(.+)</p>~iu';
  35.                         $replace = '<div class="wp-caption_one aligncenter">'.
  36.                             '<img src="foto/$1" alt="" /></div>';
  37.                     } elseif ( preg_match('~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i', $m[0]) ) {
  38.                        $pattern = '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i';
  39.                         $replace = '<p><iframe style="display: block; margin-left: auto; margin-right: auto;" src="https://www.youtube.com/embed/$2" frameborder="0" width="500" height="375"></iframe></p>';
  40.                     }
  41.              
  42.                     return preg_replace($pattern, $replace, $m[0]);
  43.                 },
  44.                 strip_tags($input)
  45.             );
  46.         }

конечный тег - </p> удалось убрать. Остался <p>. Какими только манипуляциями не пробовал, убрать не удается.

Пробовал первоначально так:
PHP:
скопировать код в буфер обмена
  1.     $regex = array (
  2.         '~photo/(.+)~iu',
  3.         '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i'
  4.     );
  5.     $regex1 = preg_replace('~<p(.*?)>(.*?)</p>~iu', '$2<br/>', $regex);

без успешно
bellagio Отправлено: 09 Апреля, 2017 - 20:00:46 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
во всех случаях, и для видео, и для картинок. Выход один, перед заменой картинки, нужно именно удалять теги абзаца <p></p>
bellagio Отправлено: 09 Апреля, 2017 - 19:38:46 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель пишет:
которые не нужно удалять

Я уже выше написал, когда посмотрел свойства функции. Только что насчитал 9 тегов, и 2 обертки. Это и заголовки и реклама и абзацы, и прочие мелочи. А если введу новое что-то для текста, то все поплывет.

Думаю, что применить иное. Может пропускать тег перед проверкой по регулярном выражению?
(Добавление)
Получается, генерируются урлы типа - <img src="foto/27.jpg</p>" alt="">
Прибавляется тег </p>
bellagio Отправлено: 09 Апреля, 2017 - 19:22:14 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель пишет:
Совет: используйте bb-кнопку [PHP] для оформления вашего кода

Учту.
Ошибку нашел. У меня есть код, который автоматически генерирует содержание, по заголовкам. И при текущем коде, теги оборачивающие содержание удаляются.

Возможно ли, исключить код начинающийся с тегов - <nav id="toc_container" class="no_bullets"> из списка обработки. Или как проще быть в такой ситуации?
(Добавление)
Не вариант, можно указать теги которые не должны удаляться, но их слишком много. это и заголовки и прочие мелочи. Нужно иное решение
bellagio Отправлено: 09 Апреля, 2017 - 19:10:52 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Очень приятно, я Александр. Будем знакомы.

По коду, спасибо. Замену видео тоже чуток укоротил:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     $input = '
  2.     Тут вступление повествующее о необходимости увидеть этот летний пейзаж именно в этом году.
  3.     foto/1.png=картинка про лето+летний пейзаж
  4.     foto/2.png=картинка про лето
  5.     Тут летний пейзаж заканчивается и хочется пожелать...
  6.      
  7.     <p>foto/3.png</p>
  8.      
  9.     foto/1.png=картинка про лето+летний пейзаж
  10.     Ну и напоследок советую посмотреть видео ролик:
  11.     https://www.youtube.com/watch?v=rC9OnOWJnY4
  12.     ';
  13.      
  14.     echo parseTagsRecursive($input);
  15.      
  16.     function parseTagsRecursive($input) {
  17.         return preg_replace_callback(
  18.             [
  19.                 '~foto/(.+)~iu',
  20.                 '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i'
  21.            ],
  22.            function ($m) {
  23.                if ( preg_match('~foto/(.+)=(.+)\+(.+)~iu', $m[0]) ) {
  24.                    $pattern = '~foto/(.+)=(.+)\+(.+)~iu';
  25.                     $replace = '<div class="wp-caption aligncenter">'.
  26.                         '<img src="foto/$1" alt="$3" />'.
  27.                         '<div class="wp-caption-text">$2</div></div>';
  28.                 } elseif ( preg_match('~foto/(.+)=(.+)~iu', $m[0]) ) {
  29.                     $pattern = '~foto/(.+)=(.+)~iu';
  30.                     $replace = '<div class="wp-caption aligncenter">'.
  31.                         '<img src="foto/$1" alt="$2" />'.
  32.                         '<div class="wp-caption-text">$2</div></div>';
  33.                 } elseif ( preg_match('~foto/(.+)~iu', $m[0]) ) {
  34.                     $pattern = '~foto/(.+)~iu';
  35.                     $replace = '<div class="wp-caption_one aligncenter">'.
  36.                         '<img src="foto/$1" alt="" /></div>';
  37.                 } elseif ( preg_match('~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i', $m[0]) ) {
  38.                    $pattern = '~https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?~i';
  39.                     $replace = '<p><iframe style="display: block; margin-left: auto; margin-right: auto;" src="https://www.youtube.com/embed/$2" frameborder="0" width="500" height="375"></iframe></p>';
  40.                 }
  41.          
  42.                 return preg_replace($pattern, $replace, $m[0]);
  43.             },
  44.             strip_tags($input)
  45.         );
  46.     }


PS По видео: очень необычный стиль, необычный голос. Позитивно и не заезжено.
(Добавление)
Ошибку нашел. У меня есть код, который автоматически генерирует содержание, по заголовкам. И при текущем коде, теги оборачивающие содержащие его удаляются
bellagio Отправлено: 09 Апреля, 2017 - 10:51:58 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Хочу выразить благодарность Человеку с большой буквы - Строителю (извините не знаю вашего имени), который не только помогает с решением задачи, но и дает возможность сперва найти ее решение самому. Это действительно очень ценно.

Спасибо Вам!

По факту задачи, проверил на десятке статей - работает. К третьему виду отображения картинок, а именно:
CODE (htmlphp):
скопировать код в буфер обмена
  1. elseif ( preg_match('~foto/(.+)~iu', $m[0]) ) {
  2.             $pattern = '~foto/(.+)~iu';
  3.             $replace = '<div class="wp-caption_one aligncenter">'.
  4.                 '<img src="foto/$1" alt="" /></div>';
  5.         }


Прикрутил плавную подгрузку картинок на страницу - https://github[dot]com/aFarkas/lazysizes так как именно третий режим используется для добавления нескольких картинок одновременно.

Но и тут выяснился баг: редактор tinymce по умолчанию вставляет в строку ссылок для картинки, теги абзаца <p></p>. То есть ссылка выглядит:

и данный код пропускает этот текст.
bellagio Отправлено: 06 Апреля, 2017 - 07:44:14 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Работает данный вариант, но как оформить еще и подхват видео. пробовал таким вариантом не выходит:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function parseTagsRecursive($input) {
  3.     $regex = '~foto/(.+)~iu';
  4.     $regex = '#https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?#i';
  5.    
  6.     return preg_replace_callback(
  7.     $regex,
  8.     function ($m) {
  9.         if ( preg_match('~foto/(.+)=(.+)\+(.+)~iu', $m[0]) ) {
  10.             $pattern = '~foto/(.+)=(.+)\+(.+)~iu';
  11.             $replace = '<div class="wp-caption aligncenter">'.
  12.                 '<img src="foto/$1" alt="$3" />'.
  13.                 '<div class="wp-caption-text">$2</div></div>';
  14.         } elseif ( preg_match('~foto/(.+)=(.+)~iu', $m[0]) ) {
  15.             $pattern = '~foto/(.+)=(.+)~iu';
  16.             $replace = '<div class="wp-caption aligncenter">'.
  17.                 '<img src="foto/$1" alt="$2" />'.
  18.                 '<div class="wp-caption-text">$2</div></div>';
  19.         } elseif ( preg_match('~foto/(.+)~iu', $m[0]) ) {
  20.             $pattern = '~foto/(.+)~iu';
  21.             $replace = '<div class="wp-caption_one aligncenter">'.
  22.                 '<img src="foto/$1" alt="" /></div>';
  23.         } elseif ( preg_match('#https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?#i', $m[0]) ) {
  24.             $pattern = '#https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?#i';
  25.             $replace = '<object width="500" height="375"><param name="wmode" value="opaque"></param><param name="movie" value="https://www.youtube.com/v/$2"></param><embed src="https://www.youtube.com/v/$2" type="application/x-shockwave-flash" width="500" height="375"></embed></param></embed></object>';
  26.         }
  27.  
  28.         return preg_replace($pattern, $replace, $m[0]);
  29.     },
  30.  
  31.     $input
  32. );
  33. }
  34.  
  35. $output = parseTagsRecursive($input);
  36.  
  37. echo $output;

при двух regex отрабатывает последний, а если ли возможность включить оба регулярных выражения?
(Добавление)
Сделал через:
PHP:
скопировать код в буфер обмена
  1.     $regex = array (
  2.         '~foto/(.+)~iu',
  3.         '#https://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?#i'
  4.     );
  5.    


отображает и картинки и видео.
bellagio Отправлено: 05 Апреля, 2017 - 22:06:45 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель отображается, но есть один момент, текстовая часть страницы плывет. То есть input может быть и такой:
PHP:
скопировать код в буфер обмена
  1. $input = '
  2. Тут вступление повествующее о необходимости увидеть этот летний пейзаж именно в этом году.
  3. foto/1.png=картинка про лето+летний пейзаж
  4. foto/2.png=картинка про лето
  5. Тут летний пейзаж заканчивается и хочется пожелать...
  6. foto/3.png
  7. foto/1.png=картинка про лето+летний пейзаж
  8. Ну и напоследок советую посмотреть видео ролик:
  9. https://www.youtube.com/watch?v=rC9OnOWJnY4
  10. ';

То есть нужно учитывать что в input -e может быть не только графическая часть, но и иная
bellagio Отправлено: 05 Апреля, 2017 - 20:10:54 • Тема: По разбивке предложения • Форум: Регулярные выражения

Ответов: 73
Просмотров: 3653
Строитель пишет:
bellagio, т.е., фактически вы подаёте на вход такую строку?

Да

Страниц (3): [1] 2 3 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB