|
|
|
| Задача:
Есть текст на странице. После ее загрузки запускается скрипт, назначение которого:
- найти в тексте страницы конструкцию вида
::[12=adress.html]адрес::
|
- вычленить из нее кусок
adress.html и номер, загнать в соответствующие массивы
- заменить в тексте первоначальную конструкцию на конструкцию вида:
Вроде просто, но регэкспы наотрез отказываются работать. Вот что у меня есть:
<script language="JavaScript">
var d=document;
function get_links() {
var test_text=d.all.text.innerHTML;
var reg=/::\[\d+?=\"(\w+?\.html)\"\]\w+?::/gi;
var res=reg.exec(test_text);
alert(res);
}
</script>
</head>
<body onload="get_links();">
<div id="text">
<h1>Заголовок</h1>
<p>Текст, из которого мне нужно вытащить некие ::[12="smth.html"]подстроки:: и вернуть их без фактических адресов.</p>
</div>
</body>
|
скрипт не выводит алерт вообще, то есть подвисает на строке
var res=reg.exec(test_text);
|
помогите пожалуйста | |
|
|
|
|
|
|
|
для: SHAman
(27.10.2006 в 13:18)
| |
::[12="smth.html"]подстроки::
|
Слово "подстроки" у вас не подходит под \w ... на php я бы предложил изменить локаль, а как это сделать в JS не знаю =)
Могу предложить заменить эту \w на что-то типа " [a-zа-яё0-9\.-_] "
ЗЫ: у меня ничего не подвисало ... выскакивал alert с "null" | |
|
|
|
|
|
|
|
для: kasmanaft
(27.10.2006 в 20:50)
| | Я пробовал задавать очевидный шаблон. Например, искал слово
Т.е., задавал избыточное условие. Браузер молчит как партизан и не выдает алерт даже без переменной, просто с сообщением. У меня IE. Мне важно, чтобы скрипт работал под ИЕ остальные не важны.
Блин, ну неужели тута нет человека, который писал статью про регулярные выражения на JS на этом сайте? Админы, ау! Откликнитесь! Реально проблема. Уже не знаю что делать. Готов обрабатывать на стороне сервера:( | |
|
|
|
|
|
|
|
для: SHAman
(27.10.2006 в 21:48)
| | Может быть дело с настройками безопасности браузера?
Что нить типа "Чтобы помочь обеспечению безопасности IE ограничил ... " ?? | |
|
|
|
|
|
|
|
для: kasmanaft
(27.10.2006 в 22:03)
| | Вряд ли. Что опасного может быть в регэкспах?
Кроме того, даже так: у меня сайт будущий рассчитан исключительно под ИЕ, в силу особенностей других браузеров. Например, опера странно реагирует на нажатие цифр в обычном режиме без установки курсора в поле ввода. А у меня клавиши цифр будут активно использоваться. Так что меня даже кроссбраузерность не интересует.
Но я хочу чтобы уж под ИЕ все работало как надо. Блин, неужели так трудно осуществить то, что я описал? Нужно всего лишь проверить текст на совпадения, запомнить куски из этих совпадений и заменить найденые совпадения на похожие. И это все. Неужели так сложно? Жопой чую - не сложно. Но как реализовать - не знаю. РегЭкспы использую в Перле, а в JS с ними странно работа организована. Не могу понять как...
Не хотелось бы обращаться на другой форум....:( | |
|
|
|
|
|
|
|
для: SHAman
(28.10.2006 в 12:28)
| | > Вряд ли. Что опасного может быть в регэкспах?
Это надо у IE спросить ... попробуйте ради эксперимента разбезопасить его.
У меня например выскакивает на верху, под адресной строкой сообщение "Чтобы помочь обеспечению безопасности IE ограничил ... " и соответственно ничего не работает....
Жму на него, разрешаю выполнение и сё работаить! :) | |
|
|
|
|
|
|
|
для: kasmanaft
(28.10.2006 в 13:11)
| | Так, действительно, что-то я прокосячил и составил выражение как-то не так. Вот что получилось:
<html>
<head>
<title>регэкспы</title>
<script language="JavaScript">
var d=document;
function get_links() {
var test_text=d.all.text.innerHTML;
var reg=/:{2}\[(\d+)=\"(\w+\.\w{2,7})\"\].*?:{2}/g;
var res=reg.exec(test_text);
alert(res);
}
</script>
</head>
<body onload="get_links();">
<div id="text">
<h1>Заголовок</h1>
<p>Текст, из которого мне нужно вытащить некие ::[12="smth.html"]подстроки:: и вернуть их без фактических ::[3="adresa.html"]адресов::</p>
</div>
</body>
|
Фишка в том, что верно находится и выводится только первое совпадение. Как мне сделать так, чтобы выводилось еще и второе и третье и т.д.? Почему-то модификатор "g" не влияет ни на что... Кстати, для меня новостью было, что русские буквы не подпадают под "\w" :-0 Интересно, почему... Пришлось ставить *. Ну, возможно, это даже лучше...
Подсобите пожалуйста вытащить другие эелементы... | |
|
|
|
|
|
|
|
для: SHAman
(30.10.2006 в 14:04)
| | Честно говоря, не дружу с javascript'ом ... но кое-что сообразил:
<html>
<head>
<title>регэкспы</title>
<script language="JavaScript">
var d=document;
function get_links() {
var test_text=d.all.text.innerHTML;
var reg=/:{2}\[(\d+)=\"(\w+\.\w{2,7})\"\].*?:{2}/g;
var res;
var arr = new Array();
while (res=reg.exec(test_text))
arr.push (res);
alert(arr);
}
</script>
</head>
<body onload="get_links();">
<div id="text">
<h1>Заголовок</h1>
<p>Текст, из которого мне нужно вытащить некие ::[12="smth.html"]подстроки:: и вернуть их без фактических ::[3="adresa.html"]адресов::</p>
</div>
</body>
|
В массиве arr у нас будет содержимое всего массива res, вместе с нулевыми элементами ... Но это уже что-то .. Отсюда уже можно плясать. | |
|
|
|
|
|
|
|
для: kasmanaft
(30.10.2006 в 18:52)
| | >Честно говоря, не дружу с javascript'ом ... но кое-что сообразил:
Я дружу, но не крепко... ;) в частности, регэкспы вообще не пользовал раньше в нем, а вот щас надо. Не хочется просто делать скрипт серверный ради такой мелочи.
----
Теперь вернемся к нашим баранам:
Основная задача, ради которой я брался вообще в этом копаться, звучит так:
- захватить все куски текста вида ...
- написать их без фактических адресов
- запомнить фактические адреса и цифры, чтобы потом использовать.
Найти - нашли, запомнить - запомнили, а вот убрать как? Там метод есть replace. Вот только как его юзать здесь - не совсем понятно. Надо обращаться к перемнным $n, а как это делать в JS? | |
|
|
|
|
|
|
|
для: SHAman
(31.10.2006 в 13:21)
| | Тогда можно было сразу метод replace использовать:
<html>
<head>
<title>регэкспы</title>
<script language="JavaScript">
var d = document;
function get_links()
{
var test_text = d.all.text.innerHTML;
var reg=/::\[(\d+)="(\w+\.\w{2,7})"\](.*?)::/g;
var res;
var arr = new Array();
function func($0,$1,$2,$3)
{
arr.push($1, $2, ' -- ');
return($3);
}
res = test_text.replace(reg, func);
alert(res);
alert(arr);
}
</script>
</head>
<body onload="get_links();">
<div id="text">
<h1>Заголовок</h1>
<p>Текст, из которого мне нужно вытащить некие ::[12="smth.html"]подстроки:: и вернуть их без фактических ::[3="adresa.html"]адресов::</p>
</div>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(31.10.2006 в 15:09)
| | Спасибо большое! Очень помогло. Заодно приобрел некий опыт работы с регэкспами в ЯС. Как допишу скрипт до конца - покажу что получилось. | |
|
|
|
|
|
|
|
для: SHAman
(02.11.2006 в 09:55)
| | Вот что получилось в результате. Спасибо большое за помощь. Сам бы долго допирал...
<html>
<head>
<title>регэкспы</title>
<script language="JavaScript">
var d = document;
var my_links = new Array('#','smth.html', 'smth_else.html');
function get_links(need_id)
{
var test_text = d.all[need_id].innerHTML;
var reg=/::\["?(\w+\.\w{2,7})"?\](.*?)::/g;
var res;
var arr = new Array();
function func($0,$1,$2) {
var hm_links=my_links.length;
arr.push($1, $2, ' -- ');
my_links.push($1);
var ret = '::[' + hm_links + ']' + $2 + '::';
return(ret);
}
res = test_text.replace(reg, func);
d.all[need_id].innerHTML=res;
alert(my_links);
}
</script>
</head>
<body onload="get_links('page_content');">
<div id="page_content">
<h1>Заголовок</h1>
<p>Текст, из которого мне нужно вытащить некие ::["smth.html"]подстроки:: и вернуть их без фактических ::[adresa.html]адресов::</p>
</div>
</body>
</html>
|
Кстати, вопрос: функция func, определенная в теле другой функции видна другим функциям? Или ее видит только родитель? | |
|
|
|
|
|
|
|
для: SHAman
(02.11.2006 в 11:18)
| | пожалуста :)
а функция, вроде бы не видна | |
|
|
|