Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск и замена текста с сохранением кусков
 
 автор: SHAman   (27.10.2006 в 13:18)   письмо автору
 
 

Задача:
Есть текст на странице. После ее загрузки запускается скрипт, назначение которого:
- найти в тексте страницы конструкцию вида

::[12=adress.html]адрес::

- вычленить из нее кусок
adress.html и номер, загнать в соответствующие массивы
- заменить в тексте первоначальную конструкцию на конструкцию вида:

::[12]адрес::


Вроде просто, но регэкспы наотрез отказываются работать. Вот что у меня есть:


<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);


помогите пожалуйста

   
 
 автор: kasmanaft   (27.10.2006 в 20:50)   письмо автору
 
   для: SHAman   (27.10.2006 в 13:18)
 


::[12="smth.html"]подстроки::

Слово "подстроки" у вас не подходит под \w ... на php я бы предложил изменить локаль, а как это сделать в JS не знаю =)
Могу предложить заменить эту \w на что-то типа " [a-zа-яё0-9\.-_] "

ЗЫ: у меня ничего не подвисало ... выскакивал alert с "null"

   
 
 автор: SHAman   (27.10.2006 в 21:48)   письмо автору
 
   для: kasmanaft   (27.10.2006 в 20:50)
 

Я пробовал задавать очевидный шаблон. Например, искал слово

/подстроки/

Т.е., задавал избыточное условие. Браузер молчит как партизан и не выдает алерт даже без переменной, просто с сообщением. У меня IE. Мне важно, чтобы скрипт работал под ИЕ остальные не важны.


Блин, ну неужели тута нет человека, который писал статью про регулярные выражения на JS на этом сайте? Админы, ау! Откликнитесь! Реально проблема. Уже не знаю что делать. Готов обрабатывать на стороне сервера:(

   
 
 автор: kasmanaft   (27.10.2006 в 22:03)   письмо автору
 
   для: SHAman   (27.10.2006 в 21:48)
 

Может быть дело с настройками безопасности браузера?
Что нить типа "Чтобы помочь обеспечению безопасности IE ограничил ... " ??

   
 
 автор: SHAman   (28.10.2006 в 12:28)   письмо автору
 
   для: kasmanaft   (27.10.2006 в 22:03)
 

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

Кроме того, даже так: у меня сайт будущий рассчитан исключительно под ИЕ, в силу особенностей других браузеров. Например, опера странно реагирует на нажатие цифр в обычном режиме без установки курсора в поле ввода. А у меня клавиши цифр будут активно использоваться. Так что меня даже кроссбраузерность не интересует.

Но я хочу чтобы уж под ИЕ все работало как надо. Блин, неужели так трудно осуществить то, что я описал? Нужно всего лишь проверить текст на совпадения, запомнить куски из этих совпадений и заменить найденые совпадения на похожие. И это все. Неужели так сложно? Жопой чую - не сложно. Но как реализовать - не знаю. РегЭкспы использую в Перле, а в JS с ними странно работа организована. Не могу понять как...

Не хотелось бы обращаться на другой форум....:(

   
 
 автор: kasmanaft   (28.10.2006 в 13:11)   письмо автору
 
   для: SHAman   (28.10.2006 в 12:28)
 

> Вряд ли. Что опасного может быть в регэкспах?
Это надо у IE спросить ... попробуйте ради эксперимента разбезопасить его.
У меня например выскакивает на верху, под адресной строкой сообщение "Чтобы помочь обеспечению безопасности IE ограничил ... " и соответственно ничего не работает....
Жму на него, разрешаю выполнение и сё работаить! :)

   
 
 автор: SHAman   (30.10.2006 в 14:04)   письмо автору
 
   для: 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 Интересно, почему... Пришлось ставить *. Ну, возможно, это даже лучше...

Подсобите пожалуйста вытащить другие эелементы...

   
 
 автор: kasmanaft   (30.10.2006 в 18:52)   письмо автору
 
   для: 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, вместе с нулевыми элементами ... Но это уже что-то .. Отсюда уже можно плясать.

   
 
 автор: SHAman   (31.10.2006 в 13:21)   письмо автору
 
   для: kasmanaft   (30.10.2006 в 18:52)
 

>Честно говоря, не дружу с javascript'ом ... но кое-что сообразил:
Я дружу, но не крепко... ;) в частности, регэкспы вообще не пользовал раньше в нем, а вот щас надо. Не хочется просто делать скрипт серверный ради такой мелочи.

----
Теперь вернемся к нашим баранам:
Основная задача, ради которой я брался вообще в этом копаться, звучит так:
- захватить все куски текста вида ...
- написать их без фактических адресов
- запомнить фактические адреса и цифры, чтобы потом использовать.

Найти - нашли, запомнить - запомнили, а вот убрать как? Там метод есть replace. Вот только как его юзать здесь - не совсем понятно. Надо обращаться к перемнным $n, а как это делать в JS?

   
 
 автор: kasmanaft   (31.10.2006 в 15:09)   письмо автору
 
   для: 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>

   
 
 автор: SHAman   (02.11.2006 в 09:55)   письмо автору
 
   для: kasmanaft   (31.10.2006 в 15:09)
 

Спасибо большое! Очень помогло. Заодно приобрел некий опыт работы с регэкспами в ЯС. Как допишу скрипт до конца - покажу что получилось.

   
 
 автор: SHAman   (02.11.2006 в 11:18)   письмо автору
 
   для: 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, определенная в теле другой функции видна другим функциям? Или ее видит только родитель?

   
 
 автор: kasmanaft   (02.11.2006 в 11:53)   письмо автору
 
   для: SHAman   (02.11.2006 в 11:18)
 

пожалуста :)
а функция, вроде бы не видна

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования