Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   RegExp + Selection (https://javascript.ru/forum/events/9994-regexp-selection.html)

googlebot 14.06.2010 23:30

RegExp + Selection
 
Здраствуйте,

помогите разобраться, почему RegExp в моем примере, не захватывает текст по бокам, а выводит только значение переменной "text"?
<script type="text/javascript">
window.onload = function() {
	document.getElementById("click").onclick = function() {
		if (window.getSelection) {
			text = window.getSelection().toString();
		}
		//...
*!*
		regex = new RegExp('(.*)' + text + '(.*)','gim');
		str = regex.exec(text);
*/!*
		alert(str + "\n");
	};
};
</script>


<a href="#" id="click">Click</a>
<p>Выделить часть текста и нажать на ссылку!</p>

рони 15.06.2010 00:47

у тебя regex больше чем text что он должен захватить?

googlebot 15.06.2010 09:16

Цитата:

Сообщение от рони
у тебя regex больше чем text что он должен захватить?

при выделении части текста, эта часть записывается в переменную (тут все ок), а нужно чтобы помимо этого текста захватился текст еще по краям (в данном случае, весь текст)

Gvozd 15.06.2010 10:08

Цитата:

Сообщение от googlebot
regex = new RegExp('(.*)' + text + '(.*)','gim'); 09        str = regex.exec(text);

а что по вашему должен вернуть этот код?
гляньте на мой измененный пример:
var text='some text';
var reg_text='(.*)' + text + '(.*)';
regex = new RegExp(reg_text,'gim');
alert(reg_text)
str = regex.exec(text);
alert(str)

подумайте, разве данная регулярка должна выводить что-то еще кроме всего содержимого переменной text

googlebot 15.06.2010 10:55

Цитата:

Сообщение от Gvozd (Сообщение 59509)
подумайте, разве данная регулярка должна выводить что-то еще кроме всего содержимого переменной text

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

скрестив ваш код, результат есть но он все равно не совсем тот.:(


window.onload = function() {
	document.getElementById("click").onclick = function() {
		if (window.getSelection) {
			text = window.getSelection().toString();
			var reg_text='(.*)' + text + '(.*)';
			regex = new  RegExp(reg_text,'gim');
		}
		alert(reg_text)
	};
};


//сейчас выводит: '(.*)' часть текста '(.*)'

//а нужно: Выделить часть текста и нажать на ссылку!", а не только выделенный

заместо '(.*)' нужно чтобы сработал regexp и захватил еще код по бокам т.е. вывел весь текст "Выделить часть текста и нажать на ссылку!", а не только выделенный.

googlebot 15.06.2010 20:33

Может я некорректно вопрос задал;)
Есть ли вообще возможность получить текстовое содержимое рядом с выделеным текстом:-?

Octane 15.06.2010 20:43

Можно. Уточните границы, рядом с текстом понятие растяжимое.

googlebot 15.06.2010 20:49

text =  window.getSelection().toString();
var reg_text='[\.](.*)' + text + '(.*\.)','gim';


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

Octane 15.06.2010 21:14

В цикле двигайте границы выделения, пока в него не попадут точки или оно не выйдет за пределы блока.

Для IE:
var range = document.selection.createRange(), text = range.text;
while (пока нет точки в начале text, и range в пределах нужного блока) {
   range.moveStart("character", -1);
   text = range.text;
   …
}
while (пока нет точки в конце text, и range в пределах нужного блока) {
   range.moveEnd("character", 1);
   text = range.text;
   …
}
Проверять нахождение в пределах блока можно поднимаясь вверх по дереву от range.parentElement().

Для остальных браузеров схема другая:
1. Получите все текстовые узлы (nodeType = 3) внутри блока, поместив их в массив.
2. Найдите в получившемся массиве элемент range.startContainer.
3. В цикле от элемента range.startContainer - 1 до начала массива складывайте nodeValue и ищите последнюю точку.
4. Для range.endContainer тоже самое в противоположном направлении.

Почитать здесь: http://fastcoder.org/articles/?aid=609

googlebot 15.06.2010 21:18

Спасибо, буду разбираться


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