Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помогите с регуляркой (https://javascript.ru/forum/misc/35082-pomogite-s-regulyarkojj.html)

ast_ross 30.01.2013 07:58

помогите с регуляркой
 
Здравствуйте уважаемые, подскажите как решить такую задачу.
Нужно подсветить результаты поиска. (например
<span class='highlight'>прив</span>ет мир
) Допустим есть строка:

"Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах."

поисковые условия могут быть: содержит, начинается с, заканчивается на если с первым вариантом проблем нет (RegExp и ключи ig) то как подсветить к примеру поисковое условие начинается с "короткомет", при чем не должно ничего подсветится при условии начинается с "ориентац" так как на самом деле предложение не начинается с этого набора... Я имею ввиду поиск RegExp без ключа g здесь не подходит. То же самое с условием заканчивается на...

Ну и вторая проблема как при поиске тапа содержит "корот" или содержит "короткометр" подсветить последнее условие. Т.е. варианты типа
<span class='highlight'><span class='highlight'>Корот</span>кометр</span>ажки
или
<span class='highlight'>Корот</span>кометражки
не верны, правильно будет
<span class='highlight'>Короткометр</span>ажки


Дайте направление куда смотреть.

ksa 30.01.2013 08:56

Цитата:

Сообщение от ast_ross
как подсветить к примеру поисковое условие начинается с "короткомет"

Как вариант...

var s='Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.';
var val='Коротком';
alert(s.replace(new RegExp('(^'+val+')',''),'($1)'));

Цитата:

Сообщение от ast_ross
То же самое с условием заканчивается на...

Как вариант...

var s='Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.';
var val='ннах.';
alert(s.replace(new RegExp('('+val+')$',''),'($1)'));

ksa 30.01.2013 08:59

Цитата:

Сообщение от ast_ross
Ну и вторая проблема как при поиске тапа содержит "корот" или содержит "короткометр" подсветить последнее условие.

Убрать первое выделение, сделать новое выделение...

ast_ross 30.01.2013 12:27

Спасибо!

ast_ross 30.01.2013 12:46

может подскажите как удалить из массива "неугодные" данные.
т.е. к примеру:
var words = ['hel','hello','wor','world'];

как получить
var words = ['hello','world'];

многократно перебирать массив?

рони 30.01.2013 12:52

ast_ross,
Как бы вы определили неугодность данных? какой кретерий?

Deff 30.01.2013 13:08

Cобственно Вам нужно узнать : Если в массиве эти элементы ?
var words = ['hel','hello','wor','world'];
var str=(','+words+',').replace(/^.*?(,hello,|,world,).*?(,world,|,hello,).*$/gm,'$1$2');
var arr = str.replace(/^,(.*),$/,'$1').split(',,')
alert(arr);

ast_ross 30.01.2013 13:12

не угодность оценивается по принципу полного содержания одной последовательности в другой, к примеру при наличии world убираем wor, так как world содержит wor...

ast_ross 30.01.2013 13:14

и еще по первому вопросу забыл как быть если надо игнорировать html теги, т.е так уже не работает.

var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
alert(s.replace(new RegExp('(^'+val+')',''),'($1)'));


но html нужно сохранить, т.е. очистить изначально текст не вариант....

рони 30.01.2013 13:31

ast_ross,
при условии однократного вхождения одного слова в другое ... вариант
var words = ['world','hel','wor','hello'];
str = words.sort().join(' ').replace(/(\S+)(.*?)(\1\S+)/g,"$2$3").match(/\S+/g)
alert(str)

ast_ross 30.01.2013 13:56

Количество вхождений не ограниченно к сожалению... Но это вопрос я решу как нибудь без регулярок, ну а как быть с:
Цитата:

и еще по первому вопросу забыл как быть если надо игнорировать html теги, т.е так уже не работает.

var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
alert(s.replace(new RegExp('(^'+val+')',''),'($1)'));


но html нужно сохранить, т.е. очистить изначально текст не вариант....

ksa 30.01.2013 14:20

Цитата:

Сообщение от ast_ross
как быть если надо игнорировать html теги

Как вариант...

var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
alert(s.replace(new RegExp('^([^>]+?>?)('+val+')',''),'$1($2)'));

ast_ross 30.01.2013 14:27

но в этом случае
var s='начало<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
alert(s.replace(new RegExp('^([^>]+?>?)('+val+')',''),'$1($2)'));

получим не совсем то что надо...

ksa 30.01.2013 14:31

Цитата:

Сообщение от ast_ross
получим не совсем то что надо...

Таки усилим нажим! :D

var s='начало<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
var r=new RegExp('^(<[^>]+>)?('+val+')','');
alert(s.replace(r,'$1($2)'));
var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
alert(s.replace(r,'$1($2)'));

ast_ross 30.01.2013 14:37

Спасибо :) может это немного нагло с моей стороны, но можно ли еще получить рабочий вариант для "заканчивается на"?

ksa 30.01.2013 14:39

Цитата:

Сообщение от ast_ross
можно ли еще получить рабочий вариант для "заканчивается на"?

Ну ты, барин, задачки ставишь! (с) :D

ksa 30.01.2013 14:42

Цитата:

Сообщение от ast_ross
рабочий вариант для "заканчивается на"

Как вариант...

var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>завершение';
var val='нах.';
var r=new RegExp('('+val+')(<[^>]+>)?$','');
alert(s.replace(r,'($1)$2'));
var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
alert(s.replace(r,'($1)$2'));

ast_ross 30.01.2013 14:43

Огромное человеческое спасибо!

Deff 30.01.2013 14:49

ksa,
:) Пора ждать: нечеловеческое спасибо!

ast_ross 30.01.2013 14:52

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

ksa 30.01.2013 14:54

Deff, да я сам рад, что и у меня хоть что-то стало получаться с этими регулярками... :D
Уш дюже прикольно они выглядят для неискушенного взгляда. Чистая галиматья! Но поражает их возможноть действия.

Deff 30.01.2013 14:55

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

далее в цикле создавать из массива регеспы и тестить строку в цикле -

Типовая задача - проверка на цензуру сообщений и вывод слов замены

ksa 30.01.2013 14:56

Цитата:

Сообщение от ast_ross
как в одну ругулярку запихать условие начинается с Корот или начинается с кор или начинается с метражка в общем проверка не на одно а несколько возможных вариантов

А там есть "перечисляемый" символ |
Цитата:

x|y Находит x или y. Например,
/green|red/
найдет 'green' в "green apple" и 'red' в "red apple."
http://javascript.ru/RegExp

ast_ross 30.01.2013 15:45

видимо я кривой или что??? Не работает эта регулярка во втором случае... что делать...
var s='начало<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
var r=new RegExp('^(<[^>]+>)?('+val+')','');
alert(s.replace(r,'$1($2)'));
var s='<p><b>Короткометражки</b> с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
alert(s.replace(r,'$1($2)'));

ast_ross 30.01.2013 16:27

ну кто нибудь подкиньте регулярку удовлетворяющую условию <p> или <p><b> или сколь угодно html тегов пробовал <\/?\w[^>]*> не работает

ast_ross 30.01.2013 17:03

кто пояснит почему в $1 содержится только <i> а не <p><b></b><i>

var s='<p><b></b><i>Короткометражки</i> с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>';
var val='Коротком';
var r=new RegExp('^(<[^>]+>){1,}?('+val+')','');
alert(s.replace(r,'$1($2)'));

Deff 30.01.2013 17:03

ast_ross,
Выразите точно условия

ast_ross 31.01.2013 07:02

Нужно заменить часть строки на такую же, только с оберткой типа
<span class='highlight'>mytext</span>
в случае если текст начинается с искомой строки.
При этом необходимо проигнорировать (если они имеются) теги html.
Т.е. к примеру искомое слово ко:

Вариант 1:
<!-- исходный текст: -->
Короткометражки с ориентацией на классику немой комедии.

<!-- после обработки: -->
<span class='highlight'>Ко</span>роткометражки с ориентацией на классику немой комедии.


Вариант 2:
<!-- исходный текст: -->
<p><b>Короткометражки</b> с ориентацией на классику немой комедии.</p>

<!-- после обработки: -->
<p><b><span class='highlight'>Ко</span>роткометражки</b> с ориентацией на классику немой комедии.</p>


Вариант 3: (ничего не изменится так не начинается на "ко")
<!-- исходный текст: -->
<p>Новые <b>короткометражки</b> с ориентацией на классику немой комедии.</p>

<!-- после обработки: -->
<p>Новые <b>короткометражки</b> с ориентацией на классику немой комедии.</p>


Вариант 4: (посложнее)
<!-- исходный текст: -->
<p><b>К</b>ороткометражки с ориентацией на классику немой комедии.</p>

<!-- после обработки: -->
<p><span class='highlight'><b>К</b>о</span>роткометражки с ориентацией на классику немой комедии.</p>

<!-- после обработки: (другой вариант) -->
<p><b><span class='highlight'>К</span></b><span class='highlight'>о</span>роткометражки с ориентацией на классику немой комедии.</p>



Все эти варианты должны быть описаны одной регуляркой.
Ну и то же самое только для условия "заканчивается на".

Deff 31.01.2013 09:35

function transF(str){
return str.replace(/^(<p>)?(<b>)(Ко(?!<))|(<b>К<\/b>о|Ко)/gm,'$1$2<span class="highlight">$3$4</span>');
}
alert(transF('<p><b>Короткометражки</b> с ориентацией на классику немой комедии.</p>'));
alert(transF('<p><b>К</b>ороткометражки с ориентацией на классику немой комедии.</p>'));
alert(transF('Короткометражки с ориентацией на классику немой комедии.'));
alert(transF('<p>Новые <b>короткометражки</b> с ориентацией на классику немой комедии.</p>'));

ast_ross 31.01.2013 11:01

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

Deff 31.01.2013 11:06

ast_ross,
1. Упрощайте, а не усложняйте задачу, -Очевидно, если К - большая - она в начале предложеия и тогда имеют значения лишь прилежащие теги.
2. Приводите все варианты*никто не будет додумывать - экстраполировать
3. Задача тянет уже на Работу
4. Есть css для первой буквы в теге http://htmlbook.ru/css/first-letter

ksa 31.01.2013 11:19

Цитата:

Сообщение от Deff
Задача тянет уже на Работу

Это точно... :D

рони 31.01.2013 11:19

ast_ross,
Вариант...
function transF(str){
return str.replace(/^(<.*?>)?(Ко|(<(.*?)>)К(<\/\4>)о)/,'$1<span class="highlight">$2</span>');
}
alert(transF('<p><p><p><b>Короткометражки</b> с ориентацией на классику немой комедии.</p>'));
alert(transF('<p><p><b>К</b>ороткометражки с ориентацией на классику немой комедии.</p>'));
alert(transF('Короткометражки с ориентацией на классику немой комедии.'));
alert(transF('<p>Новые <b>короткометражки</b> с ориентацией на классику немой комедии.</p>'));

рони 31.01.2013 11:38

Deff,
Непонял что тут не корректно?
<p><p><span class="highlight"><b>К</b>о</span>роткометражки с ориентацией на классику немой комедии.</p>

Deff 31.01.2013 11:41

рони,
:yes: Cоррь ....Заглючило воспроизведение в мозгах

olegsuv 01.02.2013 00:03

Помогите пожалуйста с регуляркой, я с ними работаю не очень, писалось очень давно и не мной.

В общем суть:
jQuery(this).html(Tmp.replace(/\[hide=([^\[]+)\]/ig, '<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">'+newHide+'</div><div class="HiddenText">').replace(/\[\/hide\]/ig, '</div></div>'));

Ищет в тексте связку [hide=50]sometext[/hide] и меняет его тегами.
Нужно искать и ББ-код hide и ahide.

В виде костыля можно было сделать так:
jQuery(this).html(Tmp.replace(/\[hide=([^\[]+)\]/ig, '<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">'+newHide+'</div><div class="HiddenText">').replace(/\[\/hide\]/ig, '</div></div>'));
jQuery(this).html(Tmp.replace(/\[ahide=([^\[]+)\]/ig, '<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">'+newHide+'</div><div class="HiddenText">').replace(/\[\/ahide\]/ig, '</div></div>'));

но в тексте скрипта очень часто используется такая регулярка и хочется цивилизованного способа, знаю что как-то через скобки и символ '|' делается, но экспериментировать на живом сайте боюсь.

рони 01.02.2013 00:20

olegsuv,
jQuery(this).html(Tmp.replace(/\[a?hide=([^\[]+)\]/ig, '<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">'+newHide+'</div><div class="HiddenText">').replace(/\[\/a?hide\]/ig, '</div></div>'));

Deff 01.02.2013 00:23

olegsuv,
1. Лучше преобразование строк делать в виде функции на входе строка, на выходе преобразованная строка.
2. Выложите пару примеров входных строк, поскольку надо учитывать возможные внутри лежащие BB и простые теги...

olegsuv 01.02.2013 00:39

Deff,
ничего необычного, что-то вроде такого:
[hide=20]Суть бага в том что прист может использовать [furl=http://cata.wowway.ru/?spell=11446]Контроль над разумом[/furl] [furl=http://cata.wowway.ru/?npc=39708] на этого моба[/furl] и использовать у него [furl=http://cata.wowway.ru/?spell=93633]вот этот спел [/furl]и этот спел дпсит в районе 200к. Всем удачи! [/hide]

Вложений хайд в хайд быть не должно, с остальным тегами конфликтовать тоже не должно.

На счет п.1 не сильно понял.

рони, спасибо за код, попробую

Deff 01.02.2013 01:24

//Параметры:  str,'hide',wrp1,wrp2
function funkReplac (a,b,c,d) {
   var reg= new RegExp ('\\['+b+'=(\\d*)+\\s*]([\\s\\S]*)?\\[\\/'+b+'\\]','igm')
   return a=a.replace(reg,c.replace('##Замена##','$1')+'$2'+d)
}
function HideReplac (str) {
var b='hide';
var c='<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">##Замена##</div><div class="HiddenText">';
var d='</div></div>';
return funkReplac (str,b,c,d)
}
function aHideReplac (str) {
var b='ahide';
var c='<div class="HiddenBlock"><div class="NeededPoints" style="display: block; ">##Замена##</div><div class="HiddenText">';
var d='</div></div>';
return funkReplac (str,b,c,d)
}


var str = '[hide=20]Суть бага в том что прист может использовать [furl=http://cata.wowway.ru/?spell=11446]Контроль над разумом[/furl] [furl=http://cata.wowway.ru/?npc=39708] на этого моба[/furl] и использовать у него [furl=http://cata.wowway.ru/?spell=93633]вот этот спел [/furl]и этот спел дпсит в районе 200к. Всем удачи! [/hide]'

alert(aHideReplac (HideReplac (str))) //

Итог для выложенного примера:
jQuery(this).html(aHideReplac(HideReplac(Tmp)));
// Можно упростить если в одной строке не встречаются одновременно  hide и ahide


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