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 :: Версия для печати :: По разбивке предложения [2]
Форумы портала PHP.SU » PHP » Регулярные выражения » По разбивке предложения

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

16. Строитель - 03 Апреля, 2017 - 22:28:05 - перейти к сообщению
bellagio пишет:
Получается, если я собираю конструкцию проверки таким образом:

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

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

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

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

где в блоке {4} будет код для обработки видео.
17. bellagio - 03 Апреля, 2017 - 22:49:24 - перейти к сообщению
попробовал вариант:
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.     }


Код отрабатывает как нужно. То есть и картинки выводит и видео. Но вопрос в том, грамотно ли в техническом плане такой вариант обработки данных в функции?
18. Строитель - 03 Апреля, 2017 - 23:11:04 - перейти к сообщению
bellagio пишет:
Но вопрос в том, грамотно ли в техническом плане такой вариант обработки данных в функции?
Я думаю, что если эти два блока кода не имеют отношения друг к другу, то лучше их разделить по разным пользовательским функциям. Так будет и логичнее, и понятнее.

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

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

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

Строитель, я думаю что проверка такого рода является структурированной. Что думаете?
20. Строитель - 04 Апреля, 2017 - 07:18:59 - перейти к сообщению
bellagio, а в третьей строке вашего кода разве не нужна конкатенации? (точка)

Без неё же результат работы первой функции будет перезаписан второй функцией.
21. bellagio - 04 Апреля, 2017 - 07:29:39 - перейти к сообщению
добавив конкатенацию:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     function out($str) {
  2.         $str = parse_links_image($str);
  3.         $str .= parse_links_video($str);
  4.        
  5.         return $str;
  6.     }

данные на странице начинаю дублироваться, то есть отображаются по два раза
22. Строитель - 04 Апреля, 2017 - 07:37:05 - перейти к сообщению
bellagio пишет:
добавив конкатенацию:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     function out($str) {
  2.         $str = parse_links_image($str);
  3.         $str .= parse_links_video($str);
  4.        
  5.         return $str;
  6.     }

данные на странице начинаю дублироваться, то есть отображаются по два раза
Ну тогда уже сами ориентируйтесь в коде, что нужно а что нет )
23. bellagio - 04 Апреля, 2017 - 07:44:26 - перейти к сообщению
У меня в коде, еще идет дополнение параметром в функции обрамления видео:
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.  

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

Я как бы в пхп не очень силен, посему, хотелось бы сделать проверку грамотной. Не приятно будет увидеть когда сайт наполнится, и поплывут данные или перестанут отображаться вовсе...
24. Строитель - 04 Апреля, 2017 - 07:52:01 - перейти к сообщению
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()
(Добавление)
А, понял - это размер определяется для видео.
25. bellagio - 04 Апреля, 2017 - 07:56:09 - перейти к сообщению
Строитель пишет:
А, понял - это размер определяется для видео.

да именно так.
26. Строитель - 04 Апреля, 2017 - 08:21:53 - перейти к сообщению
Нет, условие с определением размера не имеет отношения ко "внутренностям" функции. Просто если у вас срабатывает или картинка, или видео, то наверное в функции out нет необходимости. Но если out вам нужна как переключатель - то ваше решение верно.
27. bellagio - 04 Апреля, 2017 - 08:53:02 - перейти к сообщению
Да мне нужен именно переключатель смешанных мультимедийных (фото и видео) на странице. Собственно на данный момент это решение работает.
28. bellagio - 04 Апреля, 2017 - 12:08:18 - перейти к сообщению
Есть ошибки...
Если на странице встречается содержимое разных видов скрипт берет первое:
CODE (htmlphp):
скопировать код в буфер обмена
  1. foto/123.png=а тут описание картинки+тут альт картинки
  2. foto/123.png=а тут описание картинки
  3. foto/123.png

Получается для каждого вида писать свою функцию?
29. Строитель - 04 Апреля, 2017 - 12:31:56 - перейти к сообщению
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 в случае отсутствия совпадений.
30. bellagio - 04 Апреля, 2017 - 12:47:55 - перейти к сообщению
Не выходит. Все равно идет отображение первой картинки. остальные прописываются только текстово

 

Powered by ExBB FM 1.0 RC1