2015-04-02 5 views
2

Скажем, у меня есть:
JQuery заменить символ с другим

<h1>Win $50<h1> 

мне нужно изменить знак $ до € с JQuery
Так что я могу сделать это так:

$('h1').text($('h1').text().replace('$', '€')); 

Но что, если у меня есть что-то вроде этого:

<h1>Win $50 and Get $100</h1> 

Он меняет только первый, как я могу изменить все это?

ответ

1

Использование регулярных выражений с г флагом

$('h1').text($('h1').text().replace(/\$/g, '€')); 
+0

Спасибо, что работает – user4571629

+0

Я ответил то же самое на 2 минуты раньше. –

2

txt = $('h1').text().replace(/\$/g, '€') 
 
$('h1').text(txt);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h1>Win $50 and get $100</h1>

С регулярным выражением.

$('h1').text($('h1').text().replace(/\$/g, '€')); 

г означает «глобальных» (во всех случаях)

Как сказал RaphH, $ это специальный символ в регулярном выражении, поэтому он должен быть экранирован.

+0

$ должен быть экранирован – RafH

+0

Да да, я заметил, что я редактировал свой ответ :) спасибо –

0

Вот вспомогательная функция, которая является частью моей библиотеки, которую я добавляю в каждый фрагмент кода, который я пишу. Не стесняйтесь использовать его так, как вам нравится.

String.prototype.replaceAll = function (stringFind, stringReplace) { 
    var ex = new RegExp(stringFind.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"); 
    return this.replace(ex, stringReplace); 
}; 

Он добавляет replaceAll функцию ко всем строкам, так что вам не придется постоянно использовать регулярные выражения на протяжении всего кода.

Вы можете использовать его как этот

str.replaceAll("$", "€"); 

Вот пример:

String.prototype.replaceAll = function (stringFind, stringReplace) { 
 
    var ex = new RegExp(stringFind.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"); 
 
    return this.replace(ex, stringReplace); 
 
}; 
 

 
var str = "Win $50 and Get $100"; 
 

 
document.body.innerHTML = str.replaceAll("$", "€");


ED IT Тестовые случаев на комментарий ниже:

String.prototype.replaceAll = function (stringFind, stringReplace) { 
 
    var ex = new RegExp(stringFind.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"); 
 
    return this.replace(ex, stringReplace); 
 
}; 
 

 
var str = "test test abc test abc $%& test $%& $%&. test. abc $%& . ."; 
 
document.body.innerHTML = str + "<br />"; 
 
document.body.innerHTML += str.replaceAll(".", "") + "<br />"; 
 
document.body.innerHTML += str.replaceAll("%&", "") + "<br />"; 
 
document.body.innerHTML += str.replaceAll("test", "") + "<br />"; 
 
document.body.innerHTML += str.replaceAll("a-z", "") + "<br />";


Update

Per комментарии от Данило ниже (! Спасибо), исходная функция не позволит некоторые специальные символы, и будет ошибочным, если текстовый диапазон был введен в функцию replaceAll(). В моем собственном коде я пока не сталкивался с этими случаями.

Per this answer, я обновил свою функцию, чтобы она теперь ускользнула от RegEx, чтобы быть более эффективной в сценариях с предоставленными сценариями.

+0

вы используете квадратные скобки жгутов ваше регулярное выражение: если StringFind имеет более чем один charactore, или stringFind = "." вы получите неожиданные результаты. – Danilo

+0

@ Danilo - Пожалуйста, просмотрите мое редактирование с помощью тестовых примеров и более подробно объясните свою мысль. Эта функция отлично работает с "." или несколько символов, как показано в вышеприведенном фрагменте. –

+0

вы действительно правы: точка обрабатывается правильно, однако слова нет, попробуйте добавить это к вашему примеру: document.body.innerHTML + = str.replaceAll («test», «trial») + «
»; document.body.innerHTML + = str.replaceAll ("a-z", "someText") + "
"; – Danilo

Смежные вопросы