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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: По разбивке предложения [2]

 PHP.SU

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


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

> Без описания
Строитель Модератор
Отправлено: 03 Апреля, 2017 - 22:28:05
Post Id



Участник


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


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




bellagio пишет:
Получается, если я собираю конструкцию проверки таким образом:

Вероятно потому, что в теле функции идёт ветвление :

if () {1} elseif () {2} else {3}

В результат может попадать только какое-то одно из этих трёх условий.
(Добавление)
По идее, вам так и надо продолжать писать код. То есть:

if () {4} elseif () {1} elseif () {2} else {3}

где в блоке {4} будет код для обработки видео.
 
 Top
bellagio
Отправлено: 03 Апреля, 2017 - 22:49:24
Post Id


Новичок


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


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




попробовал вариант:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     function parse_links_image($str) {
  2.         if (preg_match('~foto/(.+)=(.+)\+(.+)~iu', $str)) {
  3.             $pattern = '~foto/(.+)=(.+)\+(.+)~iu';
  4.             $replace = '<div class="wp-caption aligncenter">'.
  5.                 '<img src="foto/$1" alt="$3" />'.
  6.                 '<div class="wp-caption-text">$2</div></div>';
  7.         } elseif (preg_match('~foto/(.+)=(.+)~iu', $str)) {
  8.             $pattern = '~foto/(.+)=(.+)~iu';
  9.             $replace = '<div class="wp-caption aligncenter">'.
  10.                 '<img src="foto/$1" alt="$2" />'.
  11.                 '<div class="wp-caption-text">$2</div></div>';
  12.         } else {
  13.             $pattern = '~foto/(.+)~iu';
  14.             $replace = '<div class="wp-caption_one aligncenter">'.
  15.                 '<img src="foto/$1" alt="" /></div>';
  16.         }
  17.  
  18.        $rules = array(
  19.            #http://(www\.)?youtube\.com/watch\?v=([^&\n]+)(&.*?(\n|\s))?#i' => '<object width="500" height="375"><param name="wmode" value="opaque"></param><param name="movie" value="http://www.youtube.com/v/$2"></param><embed src="http://www.youtube.com/v/$2" type="application/x-shockwave-flash" width="500" height="375"></embed></param></embed></object>',
  20.       );
  21.         foreach ($rules as $link => $player){
  22.         $str = preg_replace($link, $player, $str);
  23.         }
  24. }
  25.      
  26.         return preg_replace($pattern, $replace, $str);
  27.     }


Код отрабатывает как нужно. То есть и картинки выводит и видео. Но вопрос в том, грамотно ли в техническом плане такой вариант обработки данных в функции?

(Отредактировано автором: 03 Апреля, 2017 - 22:50:42)

 
 Top
Строитель Модератор
Отправлено: 03 Апреля, 2017 - 23:11:04
Post Id



Участник


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


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




bellagio пишет:
Но вопрос в том, грамотно ли в техническом плане такой вариант обработки данных в функции?
Я думаю, что если эти два блока кода не имеют отношения друг к другу, то лучше их разделить по разным пользовательским функциям. Так будет и логичнее, и понятнее.

А если нужно совместить результаты работы этих двух функций (1-я для картинок, 2-я для видео), то можно написать ещё одну функцию, в теле которой будут вызовы первых двух функций. На примере вам будет понятнее:
Спойлер (Отобразить)
Но это в том случае, если вам надо их совместить.
(Добавление)
То есть, я хотел донести мысль в том, что пользовательские функции не должны быть громоздкими. А так же, одна пользовательская функция должна выполнять одну задачу. По аналогии со встроенными пхп-функциями.

(Отредактировано автором: 03 Апреля, 2017 - 23:11:58)

 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 07:04:29
Post Id


Новичок


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


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




Строитель - спасибо за пинок!

В конечном итоге получил два вида рабочего кода. Но воспользовался более структурированным вторым. Как и подсказали сделал две функции, отдельно на видео, и отдельно на изображения. И свел проверку по двум функциям в третьей:
CODE (htmlphp):
скопировать код в буфер обмена
  1. function out($str) {
  2.     $str = parse_links_image($str);
  3.     $str = parse_links_video($str);
  4.    
  5.     return $str;
  6. }

Код отрабатывает и в процессе построения фронтенд странички преобразует строки с картинками и видео роликами, в обрамленный тегами код.

Строитель, я думаю что проверка такого рода является структурированной. Что думаете?
 
 Top
Строитель Модератор
Отправлено: 04 Апреля, 2017 - 07:18:59
Post Id



Участник


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


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




bellagio, а в третьей строке вашего кода разве не нужна конкатенации? (точка)

Без неё же результат работы первой функции будет перезаписан второй функцией.
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 07:29:39
Post Id


Новичок


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


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




добавив конкатенацию:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     function out($str) {
  2.         $str = parse_links_image($str);
  3.         $str .= parse_links_video($str);
  4.        
  5.         return $str;
  6.     }

данные на странице начинаю дублироваться, то есть отображаются по два раза
 
 Top
Строитель Модератор
Отправлено: 04 Апреля, 2017 - 07:37:05
Post Id



Участник


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


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




bellagio пишет:
добавив конкатенацию:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     function out($str) {
  2.         $str = parse_links_image($str);
  3.         $str .= parse_links_video($str);
  4.        
  5.         return $str;
  6.     }

данные на странице начинаю дублироваться, то есть отображаются по два раза
Ну тогда уже сами ориентируйтесь в коде, что нужно а что нет )
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 07:44:26
Post Id


Новичок


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


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




У меня в коде, еще идет дополнение параметром в функции обрамления видео:
CODE (htmlphp):
скопировать код в буфер обмена
  1.         function out($str,$hw_zize) {
  2.             $str = parse_links_image($str);
  3.             $str = parse_links_video($str,$hw_size);
  4.            
  5.             return $str;
  6.         }
  7. $hw_size= (isset($ry) || count(explode('x',$ry)) == 2) ? explode('x',$ry) : array(500,375);
  8.  

Может по этому.

Я как бы в пхп не очень силен, посему, хотелось бы сделать проверку грамотной. Не приятно будет увидеть когда сайт наполнится, и поплывут данные или перестанут отображаться вовсе...
 
 Top
Строитель Модератор
Отправлено: 04 Апреля, 2017 - 07:52:01
Post Id



Участник


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


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




bellagio пишет:
У меня в коде, еще идет дополнение параметром в функции обрамления видео:
CODE (htmlphp):
скопировать код в буфер обмена
  1.         function out($str,$hw_zize) {
  2.             $str = parse_links_image($str);
  3.             $str = parse_links_video($str,$hw_size);
  4.            
  5.             return $str;
  6.         }
  7. $hw_size= (isset($ry) || count(explode('x',$ry)) == 2) ? explode('x',$ry) : array(500,375);
  8.  

Может по этому.

Я как бы в пхп не очень силен, посему, хотелось бы сделать проверку грамотной. Не приятно будет увидеть когда сайт наполнится, и поплывут данные или перестанут отображаться вовсе...
Эта проверка вроде бы никак не соприкасается с функцией out()
(Добавление)
А, понял - это размер определяется для видео.
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 07:56:09
Post Id


Новичок


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


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




Строитель пишет:
А, понял - это размер определяется для видео.

да именно так.
 
 Top
Строитель Модератор
Отправлено: 04 Апреля, 2017 - 08:21:53
Post Id



Участник


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


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




Нет, условие с определением размера не имеет отношения ко "внутренностям" функции. Просто если у вас срабатывает или картинка, или видео, то наверное в функции out нет необходимости. Но если out вам нужна как переключатель - то ваше решение верно.
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 08:53:02
Post Id


Новичок


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


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




Да мне нужен именно переключатель смешанных мультимедийных (фото и видео) на странице. Собственно на данный момент это решение работает.
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 12:08:18
Post Id


Новичок


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


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




Есть ошибки...
Если на странице встречается содержимое разных видов скрипт берет первое:
CODE (htmlphp):
скопировать код в буфер обмена
  1. foto/123.png=а тут описание картинки+тут альт картинки
  2. foto/123.png=а тут описание картинки
  3. foto/123.png

Получается для каждого вида писать свою функцию?

(Отредактировано автором: 04 Апреля, 2017 - 12:29:30)

 
 Top
Строитель Модератор
Отправлено: 04 Апреля, 2017 - 12:31:56
Post Id



Участник


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


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




bellagio пишет:
Если на странице встрепывается содержимое разных видов скрипт берет первое
Это и правильно - срабатывает первый if () {}.
bellagio пишет:
Получается для каждого вида писать свою функцию?
Не обязательно. Можно просто разделить блоки ветвления, а результат каждого из них соединять конкатенацией и возвращать. На примере это будет выглядеть так:

PHP:
скопировать код в буфер обмена
  1. function parse_links_image($str) {
  2.     $result = false;
  3.    
  4.     if (1) {
  5.         $result .= 'Результат 1<br />';
  6.     }
  7.    
  8.     if (2) {
  9.         $result .= 'Результат 2<br />';
  10.     }
  11.  
  12.     if (3) {
  13.         $result .= 'Результат 3<br />';
  14.     }
  15.    
  16.     return $result;
  17. }
Таким образом, функция вернёт каждый найденный результат, или false в случае отсутствия совпадений.
 
 Top
bellagio
Отправлено: 04 Апреля, 2017 - 12:47:55
Post Id


Новичок


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


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




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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB