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 :: Рандомный выбор {o|oo|ooo}

 PHP.SU

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


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

> Без описания
Innocent
Отправлено: 29 Августа, 2013 - 21:13:31
Post Id


Новичок


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


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




Подскажите решение задачи. Чтобы быстро работало, ело мало ресурсов.
В коде страницы встречается {слово 1| слово 2| слово 3}
Как эффективнее обработать эту конструкцию, чтобы рандомно оставалось одно слово?
 
 Top
Snewer
Отправлено: 29 Августа, 2013 - 21:17:27
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


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




Можно использовать функцию explode (http://www.php.net/manual/ru/function.explode.php)
А далее из массива уже и берете рандомное значение.

p.s. в каком виде скрипт получает данные? $abc = '{слово1 | слово2}'; ? не совсем ясно

(Отредактировано автором: 29 Августа, 2013 - 21:18:54)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Августа, 2013 - 21:20:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




PHP:
скопировать код в буфер обмена
  1. $sInput = "В коде страницы встречается {слово 1| слово 2| слово 3}";
  2. $sRegexp = '~\{([^}]++)\}~ms';
  3. $sOutput = preg_replace_callback($sRegexp, function ($rgMatches) {
  4.         $rgAlternatives = explode('|',$rgMatches[1]);
  5.         return $rgAlternatives[ array_rand($rgAlternatives) ];
  6.         }, $sInput);


-----
PostgreSQL DBA
 
 Top
Innocent
Отправлено: 29 Августа, 2013 - 21:33:20
Post Id


Новичок


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


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




Спасибо за оперативный ответ.
скрипт получает данные в виде $str = "В коде страницы встречается {слово 1| слово 2| слово 3}";
Мелкий, не совсем то. помимо {слово 1| слово 2| слово 3} есть еще куча конструкий {file},{img}.
Без регулярок никак?
Можно регулярку тогда на {variator_[слово 1| слово 2| слово 3]_tagname=p}, где tagname=p является тегом, который обрамляет на выходе рандомный выбор слова.
Т.е. если такая конструкция встретилась {variator_[слово 1| слово 2| слово 3]_tagname=p}, то на выходе получили <p>слово 2</p>.
Хотелось бы услышать рациональное решение конструкции {variator_[слово 1| слово 2| слово 3]_tagname=p}.
 
 Top
Мелкий Супермодератор
Отправлено: 30 Августа, 2013 - 09:53:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Innocent пишет:
Без регулярок никак?

Сами просили "быстро работает". Значит, нужно брать инструмент, специально для этого предназначенный.

Innocent пишет:
Можно регулярку тогда на {variator_[слово 1| слово 2| слово 3]_tagname=p}, где tagname=p является тегом, который обрамляет на выходе рандомный выбор слова.

PHP:
скопировать код в буфер обмена
  1. $sInput = "Можно регулярку тогда на {variator_[слово 1| слово 2| слово 3]}, где tagname=p является тегом, который обрамляет на выходе рандомный выбор слова.
  2. Т.е. если такая конструкция встретилась {variator_[слово 1| слово 2| слово 3]_tagname=p}, то на выходе получили <p>слово 2</p>.
  3. Хотелось бы услышать рациональное решение конструкции {variator_[слово 1| слово 2| слово 3]_tagname=p}.";
  4. $sRegexp = '~\{variator_\[([^\]]++)\](?:_tagname=([a-z]+))?\}~ms';
  5. $sOutput = preg_replace_callback($sRegexp, function ($rgMatches) {
  6.         $rgAlternatives = explode('|',$rgMatches[1]);
  7.         $sSelectedAlt = $rgAlternatives[ array_rand($rgAlternatives) ];
  8.         if (isset($rgMatches[2])) {
  9.                         return '<'.$rgMatches[2].'>'.$sSelectedAlt.'</'.$rgMatches[2].'>';
  10.         } else {
  11.                         return $sSelectedAlt;
  12.                         }
  13.         }, $sInput);
  14. var_dump($sOutput);

Ради интереса сделал _tagname= необязательным.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB