Манипуляции строковыми значениями
Оглавление
Манипуляции строковыми значениями
Страница 2
Страница 3
Страница 4
Страница 5
Страница 4 из 5
Этот сценарий выведет на Web-страницу строку "Здравствуйте, Вася
Пуп-кин".
document.write(jspsStringReplace("Текущий день - день", "день",
"понедельник", 2));
Это выражение выведет на Web-страницу строку "Текущий день - понедельник".
Обратите внимание — функция выполнит замену второй подстроки "день" в заданной
строке, т. к. последним, необязательным, параметром, задающим номер заменяемой
подстроки, было передано число 2.
Народ советует
Предусматривайте в своих функциях и методах необязательные параметры и
подходящие значения по умолчанию для них. В конце концов, какие-либо сложные
задачи выполняются программистом весьма редко — большей же частью они очень
просты. Так, с помощью функции jspsStringReplace выполняется, в основном, замена
единственной подстроки в строке, поэтому последний параметр, задающий номер
заменяемой подстроки, сделан необязательным, принимающим значение по умолчанию
1.
Решение 2
Использование метода stringReplace (листинг 1.10) объекта string. Вот формат
его вызова:
<Строка>.stringReplace(<Искомая подстрока>, <3аменяющая
подстрока>[, <Номер вхождения искомой подстроки>]);
Листинг 1.10. Метод stringReplace объекта String, заменяющий заданную
подстроку другой подстрокой
function mjspsStringReplace(searchSubstring, replaceSubstring,
substringNumber) { var s1, s2, nSS = 1; var workString = new String(this); if
(!substringNumber) substringNumber = 1; var nWSLen = workString.length; var
nSSLen = searchSubstring.length; var nP = workString.indexOf(searchSubstring);
while (nP != -1) {
if (nSS == substringNumber) {
s1 = workString.substring(0, nP) ;
s2 = workString.substring(nP + nSSLen, nWSLen);
workstring = s1 + replaceSubstring + s2; break; } nP =
workstring.indexOf(searchSubstring, nP + 1) ; nSS++; } return workstring; }
String.prototype.stringReplace = mjspsStringReplace;
Пример
document.write("Текущий день - день".stringReplace("день", "понедельник", 2)
) ;
Замена всех подстрок в строке
Проблема
Функция jspsStringReplace и метод StringReplace объекта String позволяют
заменить только одно-единственное вхождение заданной подстроки. А если таких
подстрок в строке несколько, и заменить нужно их все "хором"?
Решение 1
Использование функции jspsstringRepiaceAll (листинг 1.11), формат вызова
которой приведен далее:
jspsstringRepiaceAll(<Строка>, <Искомая подстрока>,
<3аменяющая подстрока>) ;
Назначение ее параметров понятно без объяснений. Функция возвращает
обработанную строку, в которой все найденные вхождения искомой подстроки
заменены на Заменяющую подстроку. Опять же, если Искомая подстрока В Строке не
встретилась, возвращается неизмененная Строка.
Листинг 1.11. Функция jspsStringReplaceAll, заменяющая все заданные подстроки
в строке. Немного измененный вариант функции, приведенной в [1]
function jspsstringRepiaceAll(workstring, searchSubstring,
replaceSubstring)
{
var s1, s2;
var nWSLen = workstring.length;
var nSSLen = searchSubstring.length;
var nP = workstring.indexOf(searchSubstring);
while (nP !=-1) {
s1 = workString.substring(0, nP); s2 = workString.substring(nP + nSSLen,
nWSLen); workString = s1 + replaceSubstring + s2; nP =
workString.indexOf(searchSubstring); } return workString; }
Пример
var s = document.all["par"].innerHTML; s = jspsStringReplaceAllfs,
"<B>", "<I>"); s = jspsStringReplaceAlKs, "</B>",
"</I>"); document.all["par"].innerHTML = s;
Этот сценарий извлечет HTML-код, содержащийся внутри тега, имеющего значение
атрибута id, равное "par", заменит в этом коде открывающие и закрывающие теги
<B> на теги <I> снова поместит в этот тег.
Внимание!
Приведенный пример работает только в Microsoft Internet Explorer и Opera.
Firefox не поддерживает свойство innerHTML.
Решение 2
Использование метода stringReplaceAll объекта string (листинг 1.12). Он имеет
такой формат вызова:
<Строка>.stringReplaceAll{<Искомая подстрока>, <3аменяющая
подстрока>);
Листинг 1.12. Метод stringReplaceAll объекта string, заменяющий все заданные
подстроки в строке
function mjspsStringReplaceAll(searchSubstring, replaceSubstring) { var s1,
s2;
var workString = new String(this);
var nWSLen = workString.length;
var nSSLen = searchSubstring.length;
var nP = workString.indexOf(searchSubstring);
while (nP != -1)
s4 = workString.substring(0, nP) ;
s2 = workString.substring(nP + nSSLen, nWSLen);
workString = s4 + replaceSubstring + s2; nP =
workString.indexOf(searchSubstring); } return workString;
} String.prototype.stringReplaceAll = mjspsStringReplaceAll;
Пример
var s = document.all["par"].innerHTML; s = s.stringReplaceAll("<B>",
"<I>"); s = s.stringReplaceAll("</B>", "</I>");
document.all["par"].innerHTML = s;
Внимание!
Приведенный пример работает только в Microsoft Internet Explorer и Opera.
Fire-fox не поддерживает свойство innerHTML.
Форматированный вывод значений в строковом виде
Проблема
Имеется некоторая строка-шаблон и набор числовых и строковых значений. Можно
ли расставить эти значения в нужных местах строки-шаблона?
Решение
Использовать функцию jspsFormatstr (листинг 1.13), формат вызова которой
выглядит так:
jspsFormatstr{<Строка-шаблон>, <Массив значений>);
С первым параметром все понятно— в нем передается строка-шаблон. Вторым же
параметром передается массив значений. Его элементы представляют собой значения,
которые надо вставить в нужные места Строки-шаблона. Каждое из этих мест
задается особым литералом (специальным символом), который включается в текст
строки-шаблона. Литерал этот имеет такой вид: %s%.
Функция возвращает готовую строку, в нужные места которой вставлены значения,
переданные в виде элементов Массива значений. Если элементов в массиве значений
меньше, чем литералов, оставшиеся литералы будут удалены. Если же Массив
значений содержит элементов больше, чем литералов в Строке-шаблоне, лишние
элементы массива будут проигнорированы.
« Пред. - След. »