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> |
у тебя regex больше чем 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 |
Цитата:
скрестив ваш код, результат есть но он все равно не совсем тот.:( 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 и захватил еще код по бокам т.е. вывел весь текст "Выделить часть текста и нажать на ссылку!", а не только выделенный. |
Может я некорректно вопрос задал;)
Есть ли вообще возможность получить текстовое содержимое рядом с выделеным текстом:-? |
Можно. Уточните границы, рядом с текстом понятие растяжимое.
|
text = window.getSelection().toString(); var reg_text='[\.](.*)' + text + '(.*\.)','gim'; т.е. от точки (или начала строки) до точки, если выделен текст, то нужно подхватить содержимое рядом с ним по краям (абзац). |
В цикле двигайте границы выделения, пока в него не попадут точки или оно не выйдет за пределы блока.
Для 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 |
Спасибо, буду разбираться
|
Часовой пояс GMT +3, время: 05:49. |