Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Создание фильтра базы ссылок с помощью регулярных выражений (https://javascript.ru/forum/events/12619-sozdanie-filtra-bazy-ssylok-s-pomoshhyu-regulyarnykh-vyrazhenijj.html)

SvetozarPNZ 26.10.2010 09:52

Создание фильтра базы ссылок с помощью регулярных выражений
 
Есть два текстовых поля. В одном ссылки в другом маски. Как можно сделать фильтр ссылок, чтобы по заданным маскам удалялись лишние ссылки.
Пример.
База ссылок
441.vsemp.ru
52nnov.ucoz.ru
63sam.ucoz.ru
63tol.ucoz.ru
73.ucoz.ru
8999.ru
anshum.narod.ru
905.ucoz.ru
abon.net.ua
база масок
.ucoz.
narod.ru

Результат работы скрипта
441.vsemp.ru
8999.ru
abon.net.ua

Я пытался составлять регулярное выражение из строчного значения добавляя слэши, но не работает. Видимо не преобразуется строка в регекс.
function filter(){
	var mass = new Array();
	var base = new Array();
	var re = /[a-z0-9\.\-]+/gi;
	var str1;
	str = document.getElementsByName('base')[2].value;
	filterbase = str.match(re);
	for (i=0; i<filterbase.length; i++)
	{
		str1 = "/"+"filterbase[i]"+"/";
		for (k=0; k<mass.length; k++)
		{
			if (mass[k].search(str1)!=-1)
			{
				mass.splice(k,1);
			}
		}
	}
	document.getElementsByName('base')[1].value = mass.join('\n');
}


Я мог бы прогонять цикл по каждой строке текстового поля базы с целью найти подстроку-маску, но это значительно замедляет скрипт (ощутимо при 2000+ ссылок).

Есть ли идеи, решения?

рони 26.10.2010 11:10

SvetozarPNZ,
str1 = "/"+"filterbase[i]"+"/"; --- это лишнее
mass.splice(k,1); -- это без k-- пропустит элемент массива и обратиться к несуществующему .... и ещё мелочи но
Нажми на кнопку получишь результат )))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
</head>
<body>
<textarea name="base"  cols="30" rows="10">441.vsemp.ru
52nnov.ucoz.ru
63sam.ucoz.ru
63tol.ucoz.ru
73.ucoz.ru
8999.ru
anshum.narod.ru
905.ucoz.ru
abon.net.ua
</textarea>
<textarea name="mass" cols="30" rows="10">.ucoz.
narod.ru
</textarea>
<textarea name="all" cols="30" rows="10"></textarea>
<input type="button" name="go" value="go" onclick="filter()" />
<script language="JavaScript" type="text/javascript">
function filter() {
    var a = /[a-z0-9\.-]+/gi,
        c = document.getElementsByName("base")[0].value,
        b = c.match(a) || [];
        c = document.getElementsByName("mass")[0].value;
        a = c.match(a) || [];
    for (i = 0; i < a.length; i++)
    for (k = 0; k < b.length; k++)
    if (b[k] && b[k].search(a[i]) != -1) {
        b.splice(k, 1);
        k--
    }
    document.getElementsByName("all")[0].value = b.join("\n")
};
</script>
</body>
</html>

SvetozarPNZ 26.10.2010 11:19

if (mass[k].search(/.ucoz./)!=-1)
 {
	mass.splice(k,1);
}

Вот это дает результат. Вижу-вижу недочеты. А как обойти их?

Блин! У меня тут еще вопросы появляются :write:
Задался идеей парсить локально сохраненные страницы. А что-то во фрейм не подгружаются они. Вычитал такое:

function parsing(){
	document.getElementById('fr').location.href='яка/newsite.htm';
}

SvetozarPNZ 26.10.2010 11:20

Ой, да вы мне ответ написали. СПасииииибо! Я ж новичок на форуме не обратил внимание на кнопку:no:

SvetozarPNZ 26.10.2010 11:40

рони,
Цитата:

Сообщение от рони
if (b[k] && b[k].search(a[i]) != -1) {

a[i] какого типа получился? Разве не строкового?..
b[k] это проверка существования элемента?

рони 26.10.2010 16:32

SvetozarPNZ,
1.
var a = new Array(".ucoz.","narod.ru");
alert(typeof a[1]);

аргументом search может быть объект типа RegExp или строка
см. тут
2.да

SvetozarPNZ 26.10.2010 16:37

Цитата:

Сообщение от рони
аргументом search может быть объект типа RegExp или строка

Что же она у меня-то не работала. Когда я экспериментировал с
str1="/"+"filterbase[i]"+"/";
mass[k].search(str1)!=-1

рони 26.10.2010 17:14

SvetozarPNZ,
1 массив mass никак не заполнен и в нём естественно ничего не найдёться
2 str1 = new RegExp(filterbase[i])
3. http://javascript.ru/RegExp

SvetozarPNZ 28.10.2010 13:15

Аха-ха. Точно. Я просто массив в своем скрипте еще раньше определил и у меня другой скрипт его заполнял. Получается, нужно было запустить сначала тот скрипт, чтобы массив был заполнен. Спасибо. Про str1 даже по справочнику я бы не догадался, что надо так делать.
Думал, что:
var re = /.ucoz./

тоже самое, что:
var re = '/'+'.ucoz.'+'/'


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