Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена случайного пробела на строку
 
 автор: Shorr Kan   (09.02.2006 в 18:23)   письмо автору
 
 

Есть строка:

"lalala lalala lalala lalala"

Как мне в случайном порядке менять один из пробелов на " bebebe " ?

То есть, в первый раз я хочу получить:

"lalala lalala lalala bebebe lalala"

В другой:

"lalala bebebe lalala lalala lalala"

И так далее. То есть, грубо говоря, чтобы str_replace срабатывал только ОДИН раз и только на энный порядок соответствия. Наподобие: "str_replace, сделай милость, смени ОДИН пробел, который пятый по счёту в этой вот строке..."

   
 
 автор: Artemy   (09.02.2006 в 18:37)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 18:23)
 

Странная ситуация.
<?PHP
  $str 
"lalala lalala lalala lalala";
  
//Разбеваем в массив
  
$str_ar explode(" ",$str);
  
// Мешаем
  
$str_ar shuffle($str_ar);
  
//Изменяем
  
$str_ar[0] = "bebebe";
  
//Собираем строку
  
$str implode(" ",$str_ar);
  print 
$str_ar;
?>

   
 
 автор: JIEXA   (09.02.2006 в 18:43)   письмо автору
 
   для: Artemy   (09.02.2006 в 18:37)
 

Запустил ваш скрипт:

Warning: Cannot use a scalar value as an array in путь_\test.php on line 9

Warning: implode(): Bad arguments. in путь_\test.php on line 11
1


видимо где-то ошибка ((
зы: вроде бы нужно было один из пробелов заменить на "bebebe" а не слово...

   
 
 автор: JIEXA   (09.02.2006 в 18:39)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 18:23)
 

Я бы наверное так сделал бы:

<?
$string 
"lalala lalala lalala lalala";
$words explode(" "$string);
$c rand(1count($words)-1);
$new_string "";
for(
$i=0;$i<count($words);$i++)
{
    if(
$i==$c)
    {
       
$new_string .= "bebebe ";
    } 
    
$new_string .= $words[$i]." ";
}
print 
"<b>Было</b>: ".$string."<br><b>Стало:</b> ".$new_string;
?>

   
 
 автор: kasmanaft   (09.02.2006 в 18:46)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 18:23)
 

наверное можно придумать что-нибудь поеффективнее, но можно сделать так:
с помощью функции explode разбить вашу строку
$exp_mas = explode (" ",$str);

тогда в массиве будут лежать строки lalala. потом посмотреть число елементов массива, сгенерить число меньше кол-ва эл-тов, а затем в цикле заново склеить вашу строку, только перед i-тым элементом (сгерированным числом) вставить ваше bebebe :)

может быть есть решение проще, но я б не парился и быстренько сделал что-нибудь подобное :) цикл, конечно, не лучшее решение, но если строки короткие, то проблем не должно быть...

пока писал уже насоветовали :))

   
 
 автор: Shorr Kan   (09.02.2006 в 19:16)   письмо автору
 
   для: kasmanaft   (09.02.2006 в 18:46)
 

Да это всё да.. Я, как бы, догадался... Но я предполагал, что есть вариант, наподобие:

<?do_it(" ",$myword,$row,3);?> , где первое вхождение - символ, второе - что получим вместо него, третье - сама строка, а четвертое - номер встреченного символа. Т.е., в моем примере - будет изменен третий пробел.

Проблема вот в чём - если бить строку на массив по пробелам, то при склеивании текст весь перемешается. Совершенно. Мне же нужно...

было:

Hello, good day.
Bye-bye, tomorrow will be good day too.

Стало?

Hello, good ha-ha-ha day.
Bye-bye, tomorrow ha-ha-ha will be good day too.

   
 
 автор: kasmanaft   (09.02.2006 в 20:11)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 19:16)
 

что значит перемешается?
хм.. такой и должен остаться...

имеется ввиду, что текст не строка, а строки?
тогда можно перед разбиение преобразовать текст в одну строку и заменить символ \n (перенос строки) на <br> если выводить придется в html..... или же потом опять все вернуть....

   
 
 автор: Shorr Kan   (09.02.2006 в 20:17)   письмо автору
 
   для: kasmanaft   (09.02.2006 в 20:11)
 

Не так.

Текст:
"Раз, два, три, четыре, пять.
Шесть, семь, восемь, девять, десять."

Поменять на:
"Раз, два, три, хи-хи, четыре, пять.
Шесть, семь, хи-хи, восемь, девять, хи-хи, десять"

Недопустимо:
"Два, восемь, хи-хи, раз, четыре, семь.
Шесть, три, хи-хи, девять, хи-хи, пять, десять"

   
 
 автор: JIEXA   (09.02.2006 в 21:05)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 20:17)
 

Хм.. вроде как мой вариант кода ничего не нарушает...
Вы точно внимательно все смотреле?
У меня мой код вывил:

Было: Раз, два, три, четыре, пять. Шесть, семь, восемь, девять, десять.
Стало: Раз, два, три, четыре, хи-хи, пять. Шесть, семь, восемь, девять, десять.


запускал так:


<? 
$string 
"Раз, два, три, четыре, пять.
Шесть, семь, восемь, девять, десять."

$words explode(" "$string); 
$c rand(1count($words)-1); 
$new_string ""
for(
$i=0;$i<count($words);$i++) 

    if(
$i==$c
    { 
       
$new_string .= "хи-хи, "
    } 
    
$new_string .= $words[$i]." "

print 
"<b>Было</b>: ".$string."<br><b>Стало:</b> ".$new_string
?>

   
 
 автор: Axxil   (09.02.2006 в 21:13)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 20:17)
 

Вот так можно попробовать

<?
$str 
'раз, два, три, четыре.'
$arr=explode(" ",$str);
$pos=rand(1,sizeof($arr));
array_splice($arr,$pos,0,'bebebe ');
echo 
implode(" ",$arr);
?>

   
 
 автор: Shorr Kan   (09.02.2006 в 23:43)   письмо автору
 
   для: Axxil   (09.02.2006 в 21:13)
 

Да, JIEXA , вы правы. За наличием этой правоты - не могу пока проверить правоту Axxil - весь монитор занят...
Спасибо JIEXA , Axxil и господа, которые отвечали выше (имена запомнить не могу пока).
===============
Ага, похоже вариант Axxil не подходит по причине смены энного количества элементов, но не в случайных местах...
JIEXA, а ваш работает очень медленно ввиду того, что весь этот процесс мне надо сделать во внешнем цикле (т.е., неоднократно), плюс у него есть... ээ... минус. Он в полне может два "хи-хи, " расположить рядом.
Обидно.

   
 
 автор: Shorr Kan   (10.02.2006 в 02:50)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 23:43)
 

А нет ли функции, которая смещает некоторые элементы? Скажем:

$arr[0];
$arr[1];
$arr[2];
$arr[3];
$arr[4];
$arr[5];

И вот их превратить в

$arr[0];
$arr[1];
$arr[3];
$arr[4];
$arr[5];
$arr[6];

...не меняя местами.

   
 
 автор: Yuri   (10.02.2006 в 03:42)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 23:43)
 

Попробуйте такой вариант....

<?
$str 
'раз два три четыре';
$arr=explode(" ",$str);
$pos=rand(0,sizeof($arr));
$arr[$pos]='bebebe';
echo 
implode(" ",$arr);
?>

Он заменяет слово на bebebe в случайной позиции.

А если нужно чтоб слово втискивалось между строк, то идеальный вариант Axxil.
Если в строке

$pos=rand(0,sizeof($arr));

Стоит 0, то позиция может быть от первого до последнего.
Если 1, то от второго до последнего. (при данном варианте, со строкой в четыре слова - позиции могут повторяться подряд несколько раз.)

   
 
 автор: Axxil   (10.02.2006 в 09:15)   письмо автору
 
   для: Shorr Kan   (09.02.2006 в 23:43)
 

Как это не в случайных?
bebe может появится после любого слова. За это отвечает rand()

   
 
 автор: Shorr Kan   (10.02.2006 в 16:02)   письмо автору
 
   для: Axxil   (10.02.2006 в 09:15)
 

Угу. Еле вник в array_splice... спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования