download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Javascript и Регулярен израз

< 1 2 >

Автор
Съобщение
dreven
Сря, 27.03.13, 15:54
Търся прост начин да заменя в един стринг израз от вида: точка шпация някаква малка буква с точка шпация и съответната главна буква. Иде реч за кирилица. Това мога да го направя със стрингова функция, но редовете на програмата ще бъдат равни на броя на буквите. Сигурен съм, че има по-интелигентен начин. Всъщност идеята е, че имам текст в който няма главни букви и искам автоматично да го поправя.
Знам, че задачата не е сложна, но си трябва майстор на регулярните изрази. Още повече, че трябва да го използвам в Javascript - един недружелюбен според мен език.

Ако някой е използвал регулярен израз в Javascript ще му бъда благодарен да удари едно рамо и да драсне два реда като пример.

insecteater
Сря, 27.03.13, 17:05
Съвсем набързо, че работното време свърши. За съжаление JavaScript имплементацията на регулярни изрази не поддържа \U escape последователността, когато прави замяна. Чао, до след няколко часа :D
anonymous
Сря, 27.03.13, 18:35
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script language="javascript">
function see() {
	var get_div = document.getElementById('ltc');
	var str = get_div.innerHTML;
	var strVal = '';
	
    str = str.split('. '); 
	
    for (var chr = 0; chr < str.length; chr++) {
        strVal += str[chr].substring(0, 1).toUpperCase() + str[chr].substring(1, str[chr].length) + '. '
    }
 
	get_div.innerHTML = strVal;
}
</script>
</head>
 
<body onload="see()">
<div id="ltc">това е само за тест. понеже няма какво трудо да е. нали така? или не е така, а?! тест. тест е това.</div>
</body>
</html>

След изпълнението получаваш това:
Това е само за тест. Понеже няма какво трудо да е. Нали така? или не е така, а?! тест. Тест е това..

Идеята тука е да вземем текста и да го забием в променлива на js. За целта заграждаме текста в някакъв div и му даваме някакво id на този div
<div id="ltc">това е само за тест. понеже няма какво трудо да е. нали така? или не е така, а?! тест. тест е това.</div>

съставяме си една функция, която ще се вика след като се зареди страницата
<body onload="see()">

Целта на тази функция е да раздели текста по признак точка и интервал, и така разделените редове да ги набие в масив. След което на всеки елемент от масива правим първата буква да е голяма. И така, вземаме текста от нашия div
var get_div = document.getElementById('ltc');
	var str = get_div.innerHTML;

Разделяме го на части, като критерия е точка интервал
str = str.split('. ');

Организираме си цикъл за всичките елемента на получения масив (тоест: колко точки с интервал сме хванали)
for (var chr = 0; chr < str.length; chr++) {

И в този цикъл правим само първата буква от стринга голяма. Добавяме резултата в променлива, която предварително сме създали, след което добавяме и точка и интервал.
strVal += str[chr].substring(0, 1).toUpperCase() + str[chr].substring(1, str[chr].length) + '. ';

И най- накрая подменяме съдържанието на нашия div с новополученото.
get_div.innerHTML = strVal;

Сега, както виждаш това работи само за точка с последващ интервал, но ако имаш друг препинателен знак въпросителен, удивителен, многоточие или всичко, което служи за край на изречението - не работи. Ако искаш да работи и за другите препинателни знаци ще трябва да повториш занятието във функцията see() още няколко пъти с новите изисквания. Също така на последното изречение се появява една допълнителна точка ще трябва да я изрежеш.
Ами, това е.

редактиран от anonymous на 27.03.13 18:37
insecteater
Сря, 27.03.13, 19:06
Хаха, lotsofsex преварил си ме. Интересното е, че мислех да напиша точно същия алгоритъм.
phrozencrew
Сря, 27.03.13, 19:23
Още един пример от мен.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
 
<body>
 
<script>
 
var re = /^.?|\.\s.?/g;
var str = "tекст текст. текст текст. дъра бъра-бъра. дам-дам дарам.";
var newstr = str.replace(re, function(v) { return v.toUpperCase(); });
 
document.write(newstr);
</script>
 
</body>
</html>

файл: JavaScript_RegEx.html

insecteater
Сря, 27.03.13, 19:49
Хаха, супер. Обясни как работи, pls.
dreven
Сря, 27.03.13, 20:21
Благодаря, имате по едно пиене от мен. Спестихте ми маса време.
От тук нататък ще се оправя лесно.
Бъдете живи и здрави!
phrozencrew
Сря, 27.03.13, 20:50

RE: Javascript и Регулярен израз

” Хаха, супер. Обясни как работи, pls. „
Е, ти едва ли имаш затруднения с четенето на кода .
^.? - хваща първата буква от текста.
| - или
\.\s.? - претърсва за точка+шпация+някакъв друг символ (? - който се среща 0 или 1 път)
function(v) { return v.toUpperCase(); } - функцията връща горен регистър на символа, който и се подава. Вградена в регулярен израз, връща резултат при всяко съвпадение на шаблона.
g - след регулярния израз указва да се търси глобално, а не да спре при първото съвпадение.

За да работи с non-ANSI-символи, като кирилица и китайски, трябва файла да е в кодиране UTF-8. Всъщност май не е задължително, но за да се визуализират символите правилно в html си е редно.

NB! - За да се търси и замества в много редове, може да се добави и "i", т.е. .../gi.

редактиран от phrozencrew на 27.03.13 20:53
dreven
Сря, 27.03.13, 20:55
Много елегантен код е изпипал phrozencrew.
За да работи със удивителен и въпросителен нещата съвсем малко се променят:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; ">
</head>
 
<body>
 
<script>
 
var re = /^.?|\!\s.?|\.\s.?|\?\s.?/g;
var str = "tекст текст? текст текст! дъра бъра-бъра. дам-дам дарам.";
var newstr = str.replace(re, function(v) { return v.toUpperCase(); });
 
document.write(newstr);
</script>
 
</body>
</html>

редактиран от dreven на 27.03.13 20:56
редактиран от dreven на 27.03.13 20:58
phrozencrew
Сря, 27.03.13, 21:11
Ако искаш да ползваш и въпросителни, трябва да добавиш ескейпващ символ - \?, както е добавен на точката. Това е така, защото питанката се използва за вградена функция в регулярните машини.

< 1 2 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.