Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: По разбивке предложения [4]
Форумы портала PHP.SU » PHP » Регулярные выражения » По разбивке предложения

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

46. bellagio - 05 Апреля, 2017 - 22:06:45 - перейти к сообщению
Строитель отображается, но есть один момент, текстовая часть страницы плывет. То есть 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 может быть не только графическая часть, но и иная
47. Строитель - 05 Апреля, 2017 - 22:47:49 - перейти к сообщению
bellagio
Спойлер (Отобразить)
48. bellagio - 06 Апреля, 2017 - 07:44:14 - перейти к сообщению
Работает данный вариант, но как оформить еще и подхват видео. пробовал таким вариантом не выходит:
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.    


отображает и картинки и видео.
49. Строитель - 06 Апреля, 2017 - 08:07:36 - перейти к сообщению
bellagio, надо организовать структуру функции parseTagsRecursive() таким образом, чтобы в её теле происходила конкатенация двух результатов - результата обработка картинок (код, написанный вчера), и результата обработки видео. Если сами не сможете это решить, то я вечером помогу.
(Добавление)
bellagio, пока написал пост, вы нашли решение )
50. bellagio - 09 Апреля, 2017 - 10:51:58 - перейти к сообщению
Хочу выразить благодарность Человеку с большой буквы - Строителю (извините не знаю вашего имени), который не только помогает с решением задачи, но и дает возможность сперва найти ее решение самому. Это действительно очень ценно.

Спасибо Вам!

По факту задачи, проверил на десятке статей - работает. К третьему виду отображения картинок, а именно:
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>. То есть ссылка выглядит:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <p>foto/3.png</p>

и данный код пропускает этот текст.
51. Строитель - 09 Апреля, 2017 - 14:20:49 - перейти к сообщению
bellagio, спасибо за оценку Закатив глазки Зовут меня Эдуард.
Что касается тегов - их можно или вырезать на входе в функцию, или снова ковырять шаблон. Первый вариант быстрее, и выглядит так:
Спойлер (Отобразить)

(Добавление)
Сори за фтопик Прикольный видео ролик, кстати ))
52. bellagio - 09 Апреля, 2017 - 19:10:52 - перейти к сообщению
Очень приятно, я Александр. Будем знакомы.

По коду, спасибо. Замену видео тоже чуток укоротил:
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 По видео: очень необычный стиль, необычный голос. Позитивно и не заезжено.
(Добавление)
Ошибку нашел. У меня есть код, который автоматически генерирует содержание, по заголовкам. И при текущем коде, теги оборачивающие содержащие его удаляются
53. Строитель - 09 Апреля, 2017 - 19:16:10 - перейти к сообщению
bellagio пишет:
Очень приятно, я Александр. Будем знакомы.
Взаимно )
Совет: используйте bb-кнопку [PHP] для оформления вашего кода
54. bellagio - 09 Апреля, 2017 - 19:22:14 - перейти к сообщению
Строитель пишет:
Совет: используйте bb-кнопку [PHP] для оформления вашего кода

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

Возможно ли, исключить код начинающийся с тегов - <nav id="toc_container" class="no_bullets"> из списка обработки. Или как проще быть в такой ситуации?
(Добавление)
Не вариант, можно указать теги которые не должны удаляться, но их слишком много. это и заголовки и прочие мелочи. Нужно иное решение
55. Строитель - 09 Апреля, 2017 - 19:31:44 - перейти к сообщению
bellagio пишет:
И при текущем коде, теги оборачивающие содержание удаляются.
Можно в strip_tags($input) передать вторым параметром html-теги, которые не нужно удалять. Например, чтобы оставить теги параграфа, нужно записать так:
56. bellagio - 09 Апреля, 2017 - 19:38:46 - перейти к сообщению
Строитель пишет:
которые не нужно удалять

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

Думаю, что применить иное. Может пропускать тег перед проверкой по регулярном выражению?
(Добавление)
Получается, генерируются урлы типа - <img src="foto/27.jpg</p>" alt="">
Прибавляется тег </p>
57. Строитель - 09 Апреля, 2017 - 19:49:42 - перейти к сообщению
bellagio пишет:
Может пропускать тег перед проверкой по регулярном выражению?
Ну наверное да. И вообще, правильно было бы расковырять регулярку, чем вырезать все теги.
(Добавление)
bellagio пишет:
Прибавляется тег </p>
Это в каком случае он прибавляется?
58. bellagio - 09 Апреля, 2017 - 20:00:46 - перейти к сообщению
во всех случаях, и для видео, и для картинок. Выход один, перед заменой картинки, нужно именно удалять теги абзаца <p></p>
59. Строитель - 09 Апреля, 2017 - 20:09:49 - перейти к сообщению
bellagio пишет:
во всех случаях, и для видео, и для картинок. Выход один, перед заменой картинки, нужно именно удалять теги абзаца <p></p>
Ну да, я чуть выше об этом и говорил - нужно переписать шаблон.
60. bellagio - 09 Апреля, 2017 - 22:03:42 - перейти к сообщению
Сделал так:
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);

без успешно

 

Powered by ExBB FM 1.0 RC1