Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Выделить последний и символ (https://javascript.ru/forum/misc/24816-vydelit-poslednijj-i-simvol.html)

bohdantheone 14.01.2012 22:23

Выделить последний и символ
 
Подскажите как реализовать выделение цветом последнего и первого символа в тексте.

Livanderiaamarum 15.01.2012 07:38

<html>
<script>
text = "Съешь еще этих мягких французских булок да выпей же чаю, жуёба"

reg = /\s*(\S)(.*)(\S)\s*/
text = text.replace(reg, "<font color='red'>$1</font>$2<font color='red'>$3</font>")//крайние символы $1 $3, середина $2

document.write(text)
</script>
</html>

Pavel M. 15.01.2012 10:05

Цитата:

Сообщение от bohdantheone
Подскажите как реализовать выделение цветом последнего и первого символа в тексте.

по поводу первого, можно использовать css
http://htmlbook.ru/css/first-letter

bohdantheone 15.01.2012 10:48

Livanderiaamarum,
спасибо, как в этих РегЕкспах разобраться=))) Что есть хорошего почитать?

9xakep 15.01.2012 11:55

Гавнокод from 9xakep:
<html>
<script>
text = "trololo"
var str = text.split(' ').join('').split('')
var len = text.split(' ').join('').split('').length
var len2 = text.split(' ').length - 3
var first = 0
var last = len-1
var addText = text.substr(1, len+len2)
document.write("<font color='red'>"+ str[first] +"</font>"+ addText +"<font color='red'>"+ str[last] +"</font>")
</script>
</html>

Gozar 15.01.2012 12:37

<html><body>
<div id="d1" style="color:#fff">Съешь еще этих мягких французских булок да выпей же чаю, жуёба
25утолимоипечали</div>
<script>
text = document.getElementById('d1').innerHTML;

reg = /\s*(\S)(.*)(\S)\s*/
text = text.replace(reg, "<font color='red'>$1</font>$2<font color='red'>$3</font>")//крайние символы $1 $3, середина $2

document.write(text)
</script>
</html>

Рега во первых страшная - так писать её не стоит, подозреваю она всю память сожрет в длинном тексте создавая на каждый символ промежуточные сохранения, во вторых ищет не то, что должна искать.

Лучше привязываться к началу и концу текста, а не к совпадению чего-то.

Почитайте Регулярные Выражения Фридл.

Gozar 15.01.2012 13:03

<html><body><style>#d1:first-letter{color:red}</style>
<div id="d1">Съешь еще этих мягких французских булок да выпей же чаю, жуёба
25утолимоипечали</div>
<script>
var text = document.getElementById('d1').innerHTML;
text = text.replace(/([a-zа-яё])$/i, "<font color='red'>$1</font>");
document.getElementById('d1').innerHTML = text;
</script>
</html>


Внутрь класса можно добавить символ, который будет выделен, например следующий выделит точку, если она есть:
[a-zа-яё.]


Такой подход будет работать быстрее, хотя он и смешанный.

Работать будет даже при одном символе в тексте.

9xakep 15.01.2012 13:47

<html><body><style>#d1:first-letter{color:red}</style>
<div id="d1">Съешь еще этих мягких французских булок да выпей же чаю, жуёба
25утолимоипечали23</div>
<script>
var text = document.getElementById('d1').innerHTML;
text = text.replace(/([a-zа-я])$/i, "<font color='red'>$1</font>");
document.getElementById('d1').innerHTML = text;
</script>
</html>

Не будет работать, т.к.: [a-zа-я] ищет только буквы

Gozar 15.01.2012 14:07

9xakep,
Всё будет работать. Не умеешь читать ?
Цитата:

Сообщение от Gozar (Сообщение 150728)
Внутрь класса можно добавить символ, который будет выделен, например следующий выделит точку, если она есть:
[a-zа-яё.]

Добавил ё, оно отдельно в русском языке, хотя я не знаю слов заканчивающихся на ё.

Gozar 15.01.2012 14:16

9xakep,
Ты в своём говнокоде не забудь вырезать переводы строки.

Регуляркой вырезать будешь?! :D

ps: Задача не такая простая как кажется на первый взгляд и зависит от условия:
- откуда берется текст?

zebra 15.01.2012 14:39

Цитата:

Сообщение от Gozar
Добавил ё, оно отдельно в русском языке, хотя я не знаю слов заканчивающихся на ё.

ёмаё :)

monolithed 15.01.2012 14:57

Самый простой вариант:
<p id="text">text</p>

<script>
var text = document.getElementById('text');
text.innerHTML = text.innerHTML.replace(/^.|.$/g, '<span style="color:red;">$&</span>');
</script>


Без регулярных выражений:
<p id="text">text</p>

<script>
var elem = document.getElementById('text'),
	text = elem.innerHTML,
	span = ['<span style="color:red;">', '</span>'];

elem.innerHTML = span[0] + text.charAt(0) + span[1] + text.slice(1, -1) + span[0] + text.slice(-1) + span[1];
</script>

Livanderiaamarum 15.01.2012 15:02

Цитата:

Сообщение от Gozar (Сообщение 150725)
Рега во первых страшная - так писать её не стоит, подозреваю она всю память сожрет в длинном тексте создавая на каждый символ промежуточные сохранения, во вторых ищет не то, что должна искать.

Лучше привязываться к началу и концу текста, а не к совпадению чего-то.
.

толсто

Gozar 15.01.2012 15:03

monolithed,
Тема не имеет смысла без понимания входных данных. Все предложенные варианты включая мой не имеют смысла без озвучки автора входных данных.

Цитата:

Сообщение от Livanderiaamarum (Сообщение 150749)
толсто

Нет не толсто, это вообще не троллинг.

Livanderiaamarum 15.01.2012 15:04

monolithed,
Если у тьебя первым символом будет пробел что будешь делать? Красным его выделять?

Livanderiaamarum 15.01.2012 15:06

<html><body><style>#d1:first-letter{color:red}</style>
<div id="d1"> Съешь еще этих мягких французских булок да выпей же чаю, жуёба
25утолимоипечали </div>
<script>
var text = document.getElementById('d1').innerHTML;
text = text.replace(/([a-zа-яё])$/i, "<font color='red'>$1</font>");
document.getElementById('d1').innerHTML = text;
</script>
</html>


Братишка, твой способ не работает. Почитай Регулярные Выражения Фридл.

Gozar 15.01.2012 15:08

Livanderiaamarum,
Цитата:

Сообщение от Gozar (Сообщение 150750)
Тема не имеет смысла без понимания входных данных. Все предложенные варианты включая мой не имеют смысла без озвучки автора входных данных.

Что делать если там теги?

Gozar 15.01.2012 15:12

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

Хочешь разводить флуд, разводи. Задача всё равно не решена.

monolithed 15.01.2012 15:13

Цитата:

Сообщение от Livanderiaamarum
Если у тьебя первым символом будет пробел что будешь делать?

Как сказал Gozar входные данные не известны, если ведущие пробелы не нужно учитывать, то логично их обрезать или пропустить

bohdantheone 15.01.2012 15:14

Цитата:

Тема не имеет смысла без понимания входных данных
Входные данные: обычный текст, длинной до 500 символов. Пробелы до и после текста в игнор

Livanderiaamarum 15.01.2012 15:15

Цитата:

Сообщение от Gozar (Сообщение 150757)
Livanderiaamarum, пробел функционально принадлежит к знакам препинания и не является текстовым символом.

Хочешь разводить флуд, разводи. Задача всё равно не решена.

Хорошо, не проще ли написать решения для самых популярных возможный способов? например предположил что атм теги, ну ygbib для тегов в чем проблема.

Gozar 15.01.2012 15:17

Цитата:

Сообщение от bohdantheone (Сообщение 150761)
Входные данные: обычный текст, длинной до 500 символов. Пробелы до и после текста в игнор

Обычный текст без тегов и переносов строк заканчивающийся на любой текстовый символ или знак препинания?

bohdantheone 15.01.2012 15:20

Gozar,
да без тегов и переносов

Gozar 15.01.2012 15:22

Выбирай самый простой вариант monolithed, он короче в записи.

Livanderiaamarum 15.01.2012 15:26

а чем мой способ плох я так и не понял? Я про память? обьясни пожалуйста? - только то что память жрет я прочитал уже. я хочу понять что из этого вытекает?

monolithed 15.01.2012 15:29

Немного не спортивно, но как-то так:

<p id="text">   text   </p>

<script>
var text = document.getElementById('text');
text.innerHTML = text.innerHTML.replace(/^\s|\s$/g, '').replace(/^.|.$/g, '<span style="color:red;">$&</span>');
</script>

monolithed 15.01.2012 15:33

Цитата:

Сообщение от Livanderiaamarum
Я про память?

Вобще использования регексов лучше избегать, где это возможно, т.к. там более сложный лексический анализ. Чтобы это понять, лучше посмотреть исходники.

Livanderiaamarum 15.01.2012 15:41

Цитата:

Сообщение от monolithed (Сообщение 150768)
Вобще использования регексов лучше избегать, где это возможно, т.к. там более сложный лексический анализ. Чтобы это понять, лучше посмотреть исходники.

Да я уже догадался ка они работают, образуется стек))

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

это я догадался. может я не прав? но лично я бы так сделал

9xakep 15.01.2012 15:41

А мой делает более интересные вещи :D
<html><div> трололо</div>
<script>
var text = document.getElementsByTagName('div')[0].innerHTML
var str = text.split(' ').join('').split('')
var len = text.split(' ').join('').split('').length
var len2 = text.split(' ').length - 3
var first = 0
var last = len-1
var addText = text.substr(1, len+len2)
document.write("<font color='red'>"+ str[first] +"</font>"+ addText +"<font color='red'>"+ str[last] +"</font>")
</script>
</html>

Livanderiaamarum 15.01.2012 15:42

Цитата:

Сообщение от monolithed
т.к. там более сложный лексический анализ.

И в чем же там лексический анализ? Может морфологический ты хотел сказать?

Livanderiaamarum 15.01.2012 15:43

<div id="d1">Съешь еще этих мягких французских булок да выпей же чаю, жуёба
3
25утолимоипечали</div>

<script>
var text = document.getElementById('d1');
text.innerHTML = text.innerHTML.replace(/^\s|\s$/g, '').replace(/^.|.$/g, '<span style="color:red;">$&</span>');
</script>


что ты сделал с моими пробелами)?

monolithed 15.01.2012 15:44

Цитата:

Сообщение от Livanderiaamarum
И в чем же там лексический анализ?

Лексический анализ

Цитата:

Сообщение от Livanderiaamarum
что ты сделал с моими пробелами)?

опечатался, поправил

Gozar 15.01.2012 16:11

Цитата:

Сообщение от monolithed (Сообщение 150767)
Немного не спортивно, но как-то так:

<p>&nbsp;   text   &nbsp;</p>
<p id="text">&nbsp;   text   &nbsp;</p>

<script>
var text = document.getElementById('text');
text.innerHTML = text.innerHTML.replace(/^\s|\s$/g, '').replace(/^.|.$/g, '<span style="color:red;">$&</span>');
</script>

Можно забить, но существуют ещё &nbsp;

nerv_ 15.01.2012 16:12

еще такой вариант
<p> 	Duis te feugifacilisi 	</p>
<script type="text/javascript">
	with(document.getElementsByTagName("p")[0]) {
		var x = "<span style=\"color:green\">$&</span>";
		innerHTML = innerHTML.replace(/\S(?=\s*$)/, x).replace(/\S/, x);
	}
</script>

Gozar 15.01.2012 16:15

<p> 	D 	</p>
<script type="text/javascript">
	with(document.getElementsByTagName("p")[0]) {
		var x = "<span style=\"color:green\">$&</span>";
		innerHTML = innerHTML.replace(/\S(?=\s*$)/, x).replace(/\S/, x);
	}
</script>

Два реплейса подряд делать не стоит.

nerv_ 15.01.2012 16:29

Gozar, спасибо, понял. Вроде как исправил, только один момент мне остается не ясным: куда деваются пробелы и знаки табуляции в начале и конце строки?) Ясно IE шутки шутит) Собственно, какая разница как будет захватывать спан с пробелами или нет, если на странице это все равно не заметно (в данном случае)?
<p> 	   Duis te feugifacilisi    	</p>
<script type="text/javascript">
	with(document.getElementsByTagName("p")[0]) {
		innerHTML = innerHTML.replace(/^\s*(\S)|(\S)\s*$/g, function(f1, f2, f3) {
			return "<span style='color:green'>" + (f3 || f2 || f1) + "</span>";
		});
		alert("!" + innerHTML + "!");
	}
</script>

Ну как-то так...

monolithed 15.01.2012 16:37

Цитата:

Сообщение от nerv_
куда деваются пробелы и знаки табуляции в начале и конце строки?

заменяются

monolithed 15.01.2012 16:46

Цитата:

Сообщение от Gozar
но существуют ещё &nbsp;

Точно.
<p id="text">&nbsp;  &nbsp;   text &nbsp;  &nbsp; </p>

<script>
var text = document.getElementById('text');
    text.innerHTML = text.innerHTML.replace(/^(&nbsp;|\s)+|(&nbsp;|\s)+$/g, '').replace(/^.|.$/g, '<span style="color:red;">$&</span>');
</script>

nerv_ 15.01.2012 16:47

Цитата:

Сообщение от monolithed
заменяются

спасибо, но я не об этом. Я в своем примере (кот. был) брал в аргументы функции (допустим) первый символ и стоящие перед ним пробелы. А IE в отладчике показывал только этот символ, без всего остального.

Gozar 15.01.2012 17:01

Цитата:

Сообщение от monolithed (Сообщение 150791)
replace(/^(&nbsp;|\s)+|(&nbsp;|\s)+$/g, '');

Лучше не удалять, а заменять на пробелы, более правильно что ли.

В конечном счёте всё сведется к какой-нибудь реге в 50-150 символов :D


Часовой пояс GMT +3, время: 01:06.