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

Форум PHP

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

 

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

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

тема: Как ограничить str_replace?
 
 автор: Shorr Kan   (25.03.2005 в 01:29)   письмо автору
 
 

Как можно сделать str_replace только один раз? То есть, если


$a=str_replace("#symbol#",$text,$a);


И в $a #symbol# встречается много раз - как мне сделать str_replace только первого #symbol# ?

   
 
 автор: blackdog   (25.03.2005 в 02:27)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 01:29)
 

никак.

[поправлено модератором]

   
 
 автор: Shorr Kan   (25.03.2005 в 02:33)   письмо автору
 
   для: blackdog   (25.03.2005 в 02:27)
 

Как же "никак"? Еще как - "как"! Наверняка регулярные выражения это позволяют... Или какая-нибудь функция есть. Или, в конце концов, грамотный порядок применения обычных (обычными я величаю те, которые знаю) функций.

   
 
 автор: cheops   (25.03.2005 в 09:32)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 01:29)
 

Найти первое вхождение строки "#symbol#" в $a при помощи функции strpos
<?php
  $pos 
strpos($a"#symbol#");
?>

И осуществить замену при помощи функции substr
<?php
  $a 
substr($a,0,$pos) + $text substr($a$pos strlen("#symbol#"));
?>


PS Тут может где-то нужно прибавить или отнять единицу - это необходимо установить эксперементально.

   
 
 автор: Shorr Kan   (25.03.2005 в 18:11)   письмо автору
 
   для: cheops   (25.03.2005 в 09:32)
 

Откровенно говоря, ерунда какая-то получается. Я ночью попробовал сделать то же самое - кое-как работало, но не так. Удалил. Теперь попробовал повторить, но уже не получилось.


<?
$info_admin 
mysql_fetch_array(mysql_query("SELECT * FROM admin;"));
$pre_images mysql_query("SELECT * FROM images ORDER BY clicks DESC LIMIT $info_admin[sum_img];");
$z=0;
$sum_cj=$info_admin['sum_img']/100*$info_admin['procent_on_cj'];
$shablon=$info_admin['shablon'];
while(
$info_images=mysql_fetch_array($pre_images)){

$rand_href=mysql_fetch_array(mysql_query("SELECT * FROM links ORDER BY RAND() LIMIT 1;"));

$img=$info_admin['url_images'].$info_images['img'];
$foto="<a href=\"replace.php?linkid=".$href."&id=".$info_images['id']."\" target=\"_blank\"><img src=".$img." border='0'></a>";

  
$pos strpos($shablon"#img#"); 
  
$shablon substr($shablon,0,$pos).$foto.substr($shablon$pos strlen("#img#")); 


}print 
$shablon;?>




$shablon выглядит в тесте который я делаю, так:


<table border="3" bgcolor="#00FFFF"><tr><td>#img#</td><td>#img#</td></tr></table>

   
 
 автор: Shorr Kan   (25.03.2005 в 18:19)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 18:11)
 

Первое, что мне кажется неверным:


$shablon = substr($shablon,0,$pos).$foto.substr($shablon, $pos + strlen("#img#"));


Нужно


$shablon = substr($shablon,0,$pos).$foto.substr($shablon, $pos + strlen($foto));


Но работа от этого не улучшается.

   
 
 автор: XPraptor   (25.03.2005 в 18:20)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 18:11)
 

Если мне не изменяет память, то функция пишется так:
mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count])
Где count и есть параметр сколько раз менять. Или я чего то не понял в вопросе.

   
 
 автор: Shorr Kan   (25.03.2005 в 18:47)   письмо автору
 
   для: XPraptor   (25.03.2005 в 18:20)
 


$shablon=str_replace ("#img#",$foto,$shablon,1); 


Warning: Wrong parameter count for str_replace() in....

   
 
 автор: Shorr Kan   (25.03.2005 в 18:55)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 18:47)
 

Сделал вот что:


<?
$img
='';$x='';
$info_admin mysql_fetch_array(mysql_query("SELECT * FROM admin;"));
$pre_images mysql_query("SELECT * FROM images ORDER BY clicks DESC LIMIT $info_admin[sum_img];");
$z=0;$g=0;
$sum_cj=$info_admin['sum_img']/100*$info_admin['procent_on_cj'];
$shablon=$info_admin['shablon'];
$substr_count substr_count($shablon,"#img#");
while(
$info_images=mysql_fetch_array($pre_images)){
$rand_href=mysql_fetch_array(mysql_query("SELECT * FROM links ORDER BY RAND() LIMIT 1;"));
$href=$rand_href['id'];

$img=$info_admin['url_images'].$info_images['img'];
$foto="<a href=\"replace.php?linkid=".$href."&id=".$info_images['id']."\" target=\"_blank\"><img src=".$img." border='0'></a>";
 if(
$g<$substr_count){
 
$pos strpos($shablon"#img#"); 
 
$shablon substr($shablon,0,$pos).$foto.substr($shablon$pos strlen("#img#"));$g=$g+1
 }else{
 print 
$shablon;}
}
?>


Но неверность работы заключается в следующем - все картинки по вертикали идентичны. Шаблон тот же, что я давал выше.

Но теперь добавил после print $shablon; еще $g=0; - теперь полезли ошибки... как-будто не хватает открывающих/закрывающих скобок тегов.

   
 
 автор: isset   (25.03.2005 в 19:01)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 18:55)
 

Я бы сделал так:

<?
$blocked 
false;
function 
str_replace_once($search,$replace,$subject)
{
 global 
$blocked;
 if(
$blocked == false
 {
  
$blocked true;
  return 
str_replace($search,$replace,$subject);
 }
 else return 
0;
}
?>

   
 
 автор: Shorr Kan   (25.03.2005 в 19:16)   письмо автору
 
   для: isset   (25.03.2005 в 19:01)
 

Вы не поверите... я кажется сделал!


<?
$info_admin 
mysql_fetch_array(mysql_query("SELECT * FROM admin;"));
$pre_images mysql_query("SELECT * FROM images ORDER BY clicks DESC LIMIT $info_admin[sum_img];");
$g=0;
$sum_cj=$info_admin['sum_img']/100*$info_admin['procent_on_cj'];
$shablon=$info_admin['shablon'];
$substr_count substr_count($shablon,"#img#");
while(
$info_images=mysql_fetch_array($pre_images)){
$rand_href=mysql_fetch_array(mysql_query("SELECT * FROM links ORDER BY RAND() LIMIT 1;"));
$href=$rand_href['id'];

$img=$info_admin['url_images'].$info_images['img'];
$img=$info_images['img'];
$foto="<a href=\"replace.php?linkid=".$href."&id=".$info_images['id']."\" target=\"_blank\"><img src=".$img." border='0'></a>";
 if(
$g<$substr_count){if($g==0){$shablon=$info_admin['shablon'];}
 
$pos strpos($shablon"#img#"); 
 
$shablon substr($shablon,0,$pos).$foto.substr($shablon$pos strlen("#img#")+5);$g=$g+1;
 }else{
 print 
$shablon;$g=0;}
}
?>

   
 
 автор: XPraptor   (26.03.2005 в 11:55)   письмо автору
 
   для: Shorr Kan   (25.03.2005 в 19:16)
 

Сорри, в предыдущем примере не разобрался доконца. Параметр &count в функции не устанавливает кол-во изменений, а возвращает сколько было изменений и то только в PHP 5.0 и выше.
Но вот зато этот код проверил и на своей машине и в инете на сервере, он работает на PHP 4.0.1 и выше.

$strt="строка оригинал! img Слово имж будем менять один раз! img Это должно остатьтся img !";
print $strt . "<BR>";
$newstr=preg_replace("/img/", "заменил", $strt, 1);
print "Вот новая строка:<BR>" . $newstr . "<BR>";

Обращаем внимание что строку которую меняем нужно ограничить бакслэшами, потому как это типа регулярное выражение, а строку на что меняем не ограничиваем.

   
 
 автор: Shorr Kan   (26.03.2005 в 16:44)   письмо автору
 
   для: XPraptor   (26.03.2005 в 11:55)
 

Очень мило. Сравню оба варианта. Спасибо большое.

   
Rambler's Top100
вверх

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