<?php
function callback($matches)
{
return rand(0, 1) ? 'текст2' : $matches***91;0***93;;
}
$text="текст текст текст текст текст текст текст";
$text = preg_replace_callback("/(текст)/i", 'callback', $text);
echo $text;
?>
но я етой функцыии недоконца понимаю...помогите пожалуйста разобраться ...
Спустя 10 минут, 12 секунд (27.07.2012 - 21:01) dadli написал(а):
Oggy
Цитата |
Надо вывести рандомно слова |
думаю можно прошче, откуда надо рандомно слова вивести?
Спустя 2 минуты, 12 секунд (27.07.2012 - 21:04) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 18:01) | ||
Oggy
думаю можно прошче, откуда надо рандомно слова вивести? |
Надо сделать скрипт для «перемешивания» предложения.
Символ | является разделителем слов-вариантов. Например:
"Я {самый|очень} хороший программист, которому не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}."
Спустя 39 минут, 34 секунды (27.07.2012 - 21:43) dadli написал(а):
Oggy
не могу точно сказать что мои пример сами оптимални варянт, но работает.
не могу точно сказать что мои пример сами оптимални варянт, но работает.
$str = "Я {самый|очень} хороший программист, которому
не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}.";
preg_match_all("#\{(.*)\}#Uu",$str,$mas);
foreach ($mas[1] as &$val) {
$val = explode("|",$val);
$randKey = rand(0,count($val)-1);
$val = $val[$randKey];
$str = preg_replace("#^(.*)\{.*\}#uUs", "$1".$val, $str);
}
echo $str;
Спустя 22 минуты, 44 секунды (27.07.2012 - 22:06) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 18:43) |
Oggy не могу точно сказать что мои пример сами оптимални варянт, но работает. $str = "Я {самый|очень} хороший программист, которому |
Хорошо а как просто выводить рандомно два слова "текст" иля "текст2".Чтобы оно рандомно выводило или первои или второе слово....
Спустя 3 минуты, 41 секунда (27.07.2012 - 22:09) dadli написал(а):
Oggy
$string = "текст текст2";
$mas = explode(" ",$string);
$randKey = rand(0,count($mas) - 1);
echo $mas[$randKey];
Спустя 13 минут, 53 секунды (27.07.2012 - 22:23) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 19:09) |
Oggy$string = "текст текст2"; |
пробую так:
<?php
class random
{
public function generateRandomString()
{
$string = "самый очень";
$string2 = "написать сварганить запостить";
$string3 = "быстро мгновенно рандомно";
$mas = explode(" ",$string);
$randKey = rand(0,count($mas) - 1);
$mas2 = explode(" ",$string2);
$randKey2 = rand(0,count($mas2) - 1);
$mas3 = explode(" ",$string3);
$randKey3 = rand(0,count($mas3) - 1);
echo "Я,".$randKey." хороший программист, которому не составит труда ".$randKey2." код для этого задания, в котором слова будут изменяться ".$randKey3.".";
}
}
$obj=new random();
$obj->generateRandomString();
?>
выводит вместо слов цыфри....почему? )))
Спустя 1 час, 43 минуты, 38 секунд (28.07.2012 - 00:07) Guest написал(а):
потому что randKey тип integer, это индекс, а не строка. вперед php учить!
Спустя 2 дня, 13 часов, 51 минута, 29 секунд (30.07.2012 - 13:58) morovins написал(а):
dadli
а если вот такой примет будет, то как сделать?
{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.
а если вот такой примет будет, то как сделать?
{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.
Спустя 1 час, 16 минут, 57 секунд (30.07.2012 - 15:15) Oggy написал(а):
Цитата (morovins @ 30.07.2012 - 11:58) |
dadli а если вот такой примет будет, то как сделать? {Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}. |
готовый пример кода за +1 мне в карму ) ....
Спустя 1 минута, 29 секунд (30.07.2012 - 15:17) morovins написал(а):
аааа, я не могу тебе дать +1 к карме, моей группе запрещено...
Спустя 3 минуты, 28 секунд (30.07.2012 - 15:20) inpost написал(а):
Устраиваетесь на работу и хотите на халяву пройти тестирование?! Это задание многие дают И моя реализация есть в оцените этого задания
Спустя 4 минуты (30.07.2012 - 15:24) Oggy написал(а):
Цитата (inpost @ 30.07.2012 - 13:20) |
Устраиваетесь на работу и хотите на халяву пройти тестирование?! Это задание многие дают :) И моя реализация есть в оцените этого задания :) |
палево )))
вот....но думаю его можно оптимизировать...
<?php
function RandomString()
{
$string = "самый|очень";
$string2 = "написать|сварганить|запостить";
$string3 = "быстро|мгновенно|рандомно";
$mas = explode("|",$string);
$randKey = $mas[array_rand($mas, 1)];
$mas2 = explode("|",$string2);
$randKey2 = $mas2[array_rand($mas2, 1)];
$mas3 = explode("|",$string3);
$randKey3 = $mas3[array_rand($mas3, 1)];
echo "Я,".$randKey." хороший программист, которому не составит труда ".$randKey2." код для этого задания, в котором слова будут изменяться ".$randKey3.".";
}
RandomString();
?>
Спустя 7 минут, 8 секунд (30.07.2012 - 15:32) morovins написал(а):
Oggy
спасибо, а в таком виде, как написал dadli можно
inpost
нет я не устраиваюсь на работу, потому как уже имею работу и не связанную с php, просто интересно...
спасибо, а в таком виде, как написал dadli можно
$str = "Я {самый|очень} хороший программист, которому
не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}.";
preg_match_all("#\{(.*)\}#Uu",$str,$mas);
foreach ($mas[1] as &$val) {
$val = explode("|",$val);
$randKey = rand(0,count($val)-1);
$val = $val[$randKey];
$str = preg_replace("#^(.*)\{.*\}#uUs", "".$val, $str);
}
echo $str;
inpost
нет я не устраиваюсь на работу, потому как уже имею работу и не связанную с php, просто интересно...
Спустя 7 минут, 54 секунды (30.07.2012 - 15:39) morovins написал(а):
я вот так пробывал
результат вот такой
$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.';
$pattern = "#\{(.*)\}#iusU";
$res = preg_match_all($pattern, $s, $out_variables);
foreach ($out_variables[0] as $k => $v) {
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);
}
echo $s;
результат вот такой
Цитата |
Если сможете, сделайте так, чтобы это бесполезное тестовое предложение изменялось {быстро случайным образом|менялось каждый раз}. |
Спустя 9 минут, 55 секунд (30.07.2012 - 15:49) inpost написал(а):
Oggy
Код основан на том, что должна быть множественная вложенность, как это показал morovins
Код основан на том, что должна быть множественная вложенность, как это показал morovins
Спустя 16 часов, 41 минута, 17 секунд (31.07.2012 - 08:31) morovins написал(а):
Ни у кого нет идей как это реализовать или нет желания помогать?
Спустя 2 часа, 33 минуты, 39 секунд (31.07.2012 - 11:04) inpost написал(а):
ну для начала я говорил, что ответ есть на форуме мой, его просто надо поиском искать.
Дополнительно я помогать не буду по той причине, что я не хочу, чтобы на должность программиста шли люди, которые сами не могут решать поставленные задачи.
Дополнительно я помогать не буду по той причине, что я не хочу, чтобы на должность программиста шли люди, которые сами не могут решать поставленные задачи.
Спустя 6 минут, 55 секунд (1.08.2012 - 11:11) morovins написал(а):
кажись вышло реализовать, хотя не уверен что верно
Подскажите, пожалуйста, если что не верно...
Подскажите, пожалуйста, если что не верно...
$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.';
$pattern = "/\{([^\}][^\{]+?)\}/";
$res = preg_match_all($pattern, $s, $out_variables);
foreach ($out_variables[0] as $k => $v)
{
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);
$res = preg_match_all($pattern, $s, $out_variables1);
foreach ($out_variables1[0] as $k => $v)
{
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);
}
}
echo $s;
Спустя 49 минут, 4 секунды (1.08.2012 - 12:00) inpost написал(а):
morovins
Вложенность у тебя двойная, а ты сделай на 5 шагов и проверь скрипт. Если будет работать - значит ок
Вложенность у тебя двойная, а ты сделай на 5 шагов и проверь скрипт. Если будет работать - значит ок
Спустя 52 минуты, 59 секунд (1.08.2012 - 12:53) morovins написал(а):
Вот блин на 5 шагов не работает... Что же делать, может подскажите?
Спустя 16 минут, 43 секунды (1.08.2012 - 13:10) inpost написал(а):
morovins
функция должна быть рекурсионной, или цикличной. Каждый цикл должен открывать нижний уровень скобок (или верхний, но тогда медленнее работать будет). После следующая инерция цикла. 1 шаг = 1 уровень. И повторять до того времени, пока все скобки не будут открыты.
функция должна быть рекурсионной, или цикличной. Каждый цикл должен открывать нижний уровень скобок (или верхний, но тогда медленнее работать будет). После следующая инерция цикла. 1 шаг = 1 уровень. И повторять до того времени, пока все скобки не будут открыты.
Спустя 47 минут, 22 секунды (1.08.2012 - 13:57) morovins написал(а):
не могу понять... не силен я в регулярных выражениях.
Спустя 3 часа, 11 минут, 50 секунд (1.08.2012 - 17:09) inpost написал(а):
У тебя частично верно. Только зациклить его надо через do-while , и использовать preg_replace_callback(). То, что результат уже не будет изменяться вернётся в 5-ом аргументе функции callback.
Итого 1 строка инициализации $text; 1 строка на вывод результата: echo $text; 4 строки на функцию и 3 строки на цикличный запуск. Всего 9 строк.
Только что за 10 минут написал.
В том то и дело, это обычное тестовое задание, которое за 10 минут проверит знания регулярных выражений и их функций, циклов, и умение логически мыслить. А смысл обманывать работодателей, умеешь - напишешь и поступишь, не умеешь - учись дальше, эта вакансия не для тебя. К тому же практичной реализации почти не имеет, по крайней мере я не придумал, где можно хранить такого рода данные и выставлять случайным образом.
Итого 1 строка инициализации $text; 1 строка на вывод результата: echo $text; 4 строки на функцию и 3 строки на цикличный запуск. Всего 9 строк.
Только что за 10 минут написал.
В том то и дело, это обычное тестовое задание, которое за 10 минут проверит знания регулярных выражений и их функций, циклов, и умение логически мыслить. А смысл обманывать работодателей, умеешь - напишешь и поступишь, не умеешь - учись дальше, эта вакансия не для тебя. К тому же практичной реализации почти не имеет, по крайней мере я не придумал, где можно хранить такого рода данные и выставлять случайным образом.
Спустя 25 минут, 51 секунда (1.08.2012 - 17:35) pak написал(а):
у меня так вышло)
$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это
{удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось
{быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.';
$data = preg_split('#[{}]#', $s, -1, PREG_SPLIT_NO_EMPTY);
$new = '';
foreach($data as $v)
{
if(strpos($v,'|'))
{
$m = explode('|',$v);
$new .= $m[array_rand($m, 1)].' ';
}
else
$new .= $v.' ';
}
echo $new;
Спустя 14 минут, 42 секунды (1.08.2012 - 17:50) inpost написал(а):
pak
Ошибка у тебя.
Есть подстрока:
{изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}
Это имеется ввиду, что либо ЛЕВАЯ либо ПРАВАЯ часть.
Если "менялось каждый раз", значит левая часть до | не должна выводиться вообще, то есть "изменялось {} случайным образом" - не должно вывестись вообще!
Ошибка у тебя.
Есть подстрока:
{изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}
Это имеется ввиду, что либо ЛЕВАЯ либо ПРАВАЯ часть.
Если "менялось каждый раз", значит левая часть до | не должна выводиться вообще, то есть "изменялось {} случайным образом" - не должно вывестись вообще!
Спустя 4 часа, 39 минут, 16 секунд (1.08.2012 - 22:29) xlebosol написал(а):
<?php
/**
*Класс генерирует новый текст
* Новый текст генерируется путем вставки слов полученных из
* класса "RandomWords". Вставка слов происходит в цикле, где свойство "$random_words" класса "RandomWords" путем
* конкатенации соединяется с текстом, предварительно разбитого по шаблону в массив.
*/
class Proposal
{
/**
* Исходный текст
* @var string
*/
private $_text;
/**
* Шаблон выражений разделенных знаком "|"
* @var array
*/
private $_pattern_words = array();
public function __construct($text)
{
$this->_text = $text;
}
/**
*Получаем шаблон выражений для выбора случайного слова
*/
private function _findPatternWord()
{
preg_match_all('#{(.*)}#Ui', $this->_text, $this->_pattern_words);
}
/**
* Формируем массив исходного текста, разбитого по шаблону
* @return array
*/
private function _findPatternText()
{
return preg_split('#{(.*)}#Ui', $this->_text);
}
/**
* Формирем новый текст
* @return string
*/
private function _handlerText()
{
$objRandomWords = new RandomWords();
$objRandomWords->randomWord($this->_pattern_words[1]);
$i = 0;
$proposal = '';
foreach ($this->_findPatternText() as $party_text) {
foreach ($objRandomWords as $words) {
$proposal .= $party_text . $words[$i++];
}
}
return $proposal;
}
/**
* Проверяем входные данные на корректность
* @return string
*/
public function processProposal()
{
if (!empty($this->_text)) {
$this->_findPatternWord();
return $this->_handlerText();
} else {
echo 'Отсутствует текст для обработки!';
exit();
}
}
}
/**
*Класс генерирует список случайных слов
* Замена слов происходит в классе "Proposal".
*/
class RandomWords
{
/**
* Список случайных слов
* @var array
*/
public $random_words = array();
/**
*Символ раздела выражений
*/
const SEPARATOR = '|';
/**
* Формируем список случайных слов
* @param $pattern_words
*/
public function randomWord($pattern_words)
{
if (!empty($pattern_words)) {
foreach ($pattern_words as $words) {
$exp = explode(self::SEPARATOR, $words);
$r = rand(0, count($exp) - 1);
$this->random_words[] = $exp[$r];
}
} else {
echo 'Отсутствут шаблон слов!';
exit();
}
}
}
$text = 'Я {самый|очень} хороший программист, которому не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}.';
$objProposal = new Proposal($text);
echo $objProposal->processProposal();
?>
Мой вариант для самого хорошего и рандомного программиста.
/**
*Класс генерирует новый текст
* Новый текст генерируется путем вставки слов полученных из
* класса "RandomWords". Вставка слов происходит в цикле, где свойство "$random_words" класса "RandomWords" путем
* конкатенации соединяется с текстом, предварительно разбитого по шаблону в массив.
*/
class Proposal
{
/**
* Исходный текст
* @var string
*/
private $_text;
/**
* Шаблон выражений разделенных знаком "|"
* @var array
*/
private $_pattern_words = array();
public function __construct($text)
{
$this->_text = $text;
}
/**
*Получаем шаблон выражений для выбора случайного слова
*/
private function _findPatternWord()
{
preg_match_all('#{(.*)}#Ui', $this->_text, $this->_pattern_words);
}
/**
* Формируем массив исходного текста, разбитого по шаблону
* @return array
*/
private function _findPatternText()
{
return preg_split('#{(.*)}#Ui', $this->_text);
}
/**
* Формирем новый текст
* @return string
*/
private function _handlerText()
{
$objRandomWords = new RandomWords();
$objRandomWords->randomWord($this->_pattern_words[1]);
$i = 0;
$proposal = '';
foreach ($this->_findPatternText() as $party_text) {
foreach ($objRandomWords as $words) {
$proposal .= $party_text . $words[$i++];
}
}
return $proposal;
}
/**
* Проверяем входные данные на корректность
* @return string
*/
public function processProposal()
{
if (!empty($this->_text)) {
$this->_findPatternWord();
return $this->_handlerText();
} else {
echo 'Отсутствует текст для обработки!';
exit();
}
}
}
/**
*Класс генерирует список случайных слов
* Замена слов происходит в классе "Proposal".
*/
class RandomWords
{
/**
* Список случайных слов
* @var array
*/
public $random_words = array();
/**
*Символ раздела выражений
*/
const SEPARATOR = '|';
/**
* Формируем список случайных слов
* @param $pattern_words
*/
public function randomWord($pattern_words)
{
if (!empty($pattern_words)) {
foreach ($pattern_words as $words) {
$exp = explode(self::SEPARATOR, $words);
$r = rand(0, count($exp) - 1);
$this->random_words[] = $exp[$r];
}
} else {
echo 'Отсутствут шаблон слов!';
exit();
}
}
}
$text = 'Я {самый|очень} хороший программист, которому не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}.';
$objProposal = new Proposal($text);
echo $objProposal->processProposal();
?>
Мой вариант для самого хорошего и рандомного программиста.
Спустя 1 час, 1 минута, 40 секунд (1.08.2012 - 23:31) inpost написал(а):
xlebosol
ну для начала долго работать будет, а как второй - где множественная вложенность? Ты тестируешь на самой простой строке, а внутри фигурных скобок должны быть ещё фигурные. Кроме этого по тексту могут быть одна фигурная, которая нарушает код, то есть открытая, но не закрывается, его то игнорировать надо
Я выше код такой же обвинил в том, что он не работает с множественной вложенностью. Твой работает?
ну для начала долго работать будет, а как второй - где множественная вложенность? Ты тестируешь на самой простой строке, а внутри фигурных скобок должны быть ещё фигурные. Кроме этого по тексту могут быть одна фигурная, которая нарушает код, то есть открытая, но не закрывается, его то игнорировать надо
Я выше код такой же обвинил в том, что он не работает с множественной вложенностью. Твой работает?
Спустя 10 часов, 41 минута, 46 секунд (2.08.2012 - 10:12) morovins написал(а):
inpost большое спасибо за помощь
Я вот так сделал, кажись работает...
Я вот так сделал, кажись работает...
$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно {вапеапреапре|жжджщзжщ {удивительное {важное|бесполезное} |крутое|простое} |тиььтиьти} |правильно} случайным образом|менялось каждый раз}.'; //7 вложений
echo parse($s);
function parse($str) {
$count = substr_count($str, '{');
for($i=0;$i<$count;$i++) {
$str = preg_replace_callback("#{([^{}]*?)}#ms", "callback", $str);
}
return $str;
}
function callback($matches) {
$v = explode('|',$matches[1]);
return $v[mt_rand(0,count($v)-1)];
}
Спустя 2 часа, 21 минута, 9 секунд (2.08.2012 - 12:34) inpost написал(а):
morovins
Очень похож на мой код. Вот глянь:
Очень похож на мой код. Вот глянь:
<?php header("Content-Type: text/html; charset=utf-8"); error_reporting(E_ALL);
echo ($text = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.').'<pre>';
function test($matches) {
$temp = explode('|',$matches[1]);
return $temp[rand(0,count($temp)-1)];
}
do {
$text = preg_replace_callback('#\{([^\{]+)\}#iusU','test',$text,-1,$count);
} while($count);
echo $text;
Спустя 24 минуты, 49 секунд (2.08.2012 - 12:58) morovins написал(а):
inpost большое спасибо за помощь.
Спустя 6 минут, 30 секунд (2.08.2012 - 13:05) inpost написал(а):
morovins
Не за что. Ты же сам почти всё реализовал. А таким людям не стыдно и помогать.
в целом
Вот и ещё одно приятное место, где использую do-while.
Не за что. Ты же сам почти всё реализовал. А таким людям не стыдно и помогать.
в целом
Вот и ещё одно приятное место, где использую do-while.