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

HTML+CSS+JavaScript

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

 

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

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

тема: Проблемы с .replace
 
 автор: ExtraBrain   (09.01.2007 в 14:58)   письмо автору
 
 

Хочу написать функцию замены всех подстрок в строке. Вот что получилось.


<html>
<head>
<title>StrReplace</title>

<script>
function StrReplace(p1,p2,s) {
 if (p1==p2) return s;
 while (s.indexOf(p1)>=0) s=s.replace(p1,p2);
 return s;
}
</script>

</head>
<body>
<script>
 var s='RRR';
 document.write(StrReplace('R','-P-',s)); // Вот так работает 
 document.write(StrReplace('R','-R-',s)); // А вот так зацикливается
</script>
</body>
</html>



Что исправить чтобы работало ВСЕГДА ?

   
 
 автор: 12345   (09.01.2007 в 15:16)   письмо автору
 
   для: ExtraBrain   (09.01.2007 в 14:58)
 

Чего бы ему не зацикливаться, если при таком действии всегда будет s.indexOf(p1)>=0 во 2-м случае?

если надо заменить все R на "-R-", то делают не так. Вместо
while (s.indexOf(p1)>=0) s=s.replace(p1,p2);return s;
пишут
return s.replace(new RegExp(p1,'g'),p2);

(Читайте http://javascript.aho.ru/files/js/RegExpJS.html про new RegExp(,). )

   
 
 автор: ExtraBrain   (09.01.2007 в 15:57)   письмо автору
 
   для: 12345   (09.01.2007 в 15:16)
 

Сделал как Вы сказали

<html>
<head>
<title>StrReplace</title>

<script>
function StrReplace(p1,p2,s) {
 return s.replace(RegExp(p1,'g'),p2);
}
</script>

</head>
<body>
<script>
 var s1='4RRR';
 document.write(StrReplace('4R','R',s1),'<br>'); // Это работает 

 var s2='*FFF';
 document.write(StrReplace('*F','F',s2),'<br>'); // А это ничего не выводит.
</script>
</body>
</html>


Хотелось бы получить универсальную функцию, чтобы ВСЁ заменяла.

   
 
 автор: 12345   (09.01.2007 в 17:25)   письмо автору
 
   для: ExtraBrain   (09.01.2007 в 15:57)
 

Дело в том, что Вы в параметре p1 используете текст регулярного выражения, следовательно, надо "уважать законы". Смотрите в описании, что означает знак "*" - это специальный символ. (Чтобы его экранировать, пишем "\*F".)

Если уж серьёзно так важно, чтобы не действовали спецсимволы, напишите функцию вставки перед ними (список из того же описания) знаков "\".

   
 
 автор: ExtraBrain   (09.01.2007 в 17:32)   письмо автору
 
   для: 12345   (09.01.2007 в 17:25)
 

Спасибо за помощь но не сложилось у меня с RegExp, никогда не догонял этих регулярных выражениёв :-)
Вот что получилось без них:

<html>
<head>
<title>StrReplace</title>

<script>

function StrReplace(p1,p2,s) {

 var i,s1='';
 var lp1=p1.length;
 var ls=s.length;

 if (s=='' && p1=='') return p2;
 if (s=='' && p1!='') return s;
 if (s!='' && p1=='') return s;
 if (p1==p2) return s;
 if (s.indexOf(p1)<0) return s;


 while (1==1) {
  i = s.indexOf(p1);
  if (i>=0) {
    if (i>0) s1+=s.substring(0,i);
    s1+=p2;
    s=s.substring(i+lp1,ls);
    if (s=='') return s1;
  }
  else {
    s1+=s;
    return s1;
  }
 }

}

</script>

</head>
<body>
<script>
 s='[+*/-ju 777 j*]';
 document.write(s,'<br>');
 document.write(StrReplace('ju','RaR',s),'<br>');
</script>
</body>
</html>

   
 
 автор: 12345   (09.01.2007 в 17:35)   письмо автору
 
   для: ExtraBrain   (09.01.2007 в 17:32)
 

А никто не говорил, что это просто :)

   
Rambler's Top100
вверх

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