помогите с регуляркой
Здравствуйте уважаемые, подскажите как решить такую задачу.
Нужно подсветить результаты поиска. (например <span class='highlight'>прив</span>ет мир) Допустим есть строка: "Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах." поисковые условия могут быть: содержит, начинается с, заканчивается на если с первым вариантом проблем нет (RegExp и ключи ig) то как подсветить к примеру поисковое условие начинается с "короткомет", при чем не должно ничего подсветится при условии начинается с "ориентац" так как на самом деле предложение не начинается с этого набора... Я имею ввиду поиск RegExp без ключа g здесь не подходит. То же самое с условием заканчивается на... Ну и вторая проблема как при поиске тапа содержит "корот" или содержит "короткометр" подсветить последнее условие. Т.е. варианты типа <span class='highlight'><span class='highlight'>Корот</span>кометр</span>ажкиили <span class='highlight'>Корот</span>кометражкине верны, правильно будет <span class='highlight'>Короткометр</span>ажки Дайте направление куда смотреть. |
Цитата:
var s='Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.'; var val='Коротком'; alert(s.replace(new RegExp('(^'+val+')',''),'($1)')); Цитата:
var s='Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.'; var val='ннах.'; alert(s.replace(new RegExp('('+val+')$',''),'($1)')); |
Цитата:
|
Спасибо!
|
может подскажите как удалить из массива "неугодные" данные.
т.е. к примеру: var words = ['hel','hello','wor','world']; как получить var words = ['hello','world']; многократно перебирать массив? |
ast_ross,
Как бы вы определили неугодность данных? какой кретерий? |
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); |
не угодность оценивается по принципу полного содержания одной последовательности в другой, к примеру при наличии world убираем wor, так как world содержит wor...
|
и еще по первому вопросу забыл как быть если надо игнорировать html теги, т.е так уже не работает.
var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>'; var val='Коротком'; alert(s.replace(new RegExp('(^'+val+')',''),'($1)')); но html нужно сохранить, т.е. очистить изначально текст не вариант.... |
ast_ross,
при условии однократного вхождения одного слова в другое ... вариант var words = ['world','hel','wor','hello']; str = words.sort().join(' ').replace(/(\S+)(.*?)(\1\S+)/g,"$2$3").match(/\S+/g) alert(str) |
Количество вхождений не ограниченно к сожалению... Но это вопрос я решу как нибудь без регулярок, ну а как быть с:
Цитата:
|
Цитата:
var s='<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>'; var val='Коротком'; alert(s.replace(new RegExp('^([^>]+?>?)('+val+')',''),'$1($2)')); |
но в этом случае
var s='начало<p>Короткометражки с ориентацией на классику немой комедии, первая из которых была номинирована на «Золотую пальмовую ветвь» в Каннах.</p>'; var val='Коротком'; alert(s.replace(new RegExp('^([^>]+?>?)('+val+')',''),'$1($2)')); получим не совсем то что надо... |
Цитата:
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)')); |
Спасибо :) может это немного нагло с моей стороны, но можно ли еще получить рабочий вариант для "заканчивается на"?
|
Цитата:
|
Цитата:
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')); |
Огромное человеческое спасибо!
|
ksa,
:) Пора ждать: нечеловеческое спасибо! |
А что если еще усложнить задачу, как в одну ругулярку запихать условие начинается с Корот или начинается с кор или начинается с метражка в общем проверка не на одно а несколько возможных вариантов
|
Deff, да я сам рад, что и у меня хоть что-то стало получаться с этими регулярками... :D
Уш дюже прикольно они выглядят для неискушенного взгляда. Чистая галиматья! Но поражает их возможноть действия. |
ast_ross,
Проще(и удобнее, поскольку можно наращивать) создать массив проверочных слов далее в цикле создавать из массива регеспы и тестить строку в цикле - Типовая задача - проверка на цензуру сообщений и вывод слов замены |
Цитата:
Цитата:
|
видимо я кривой или что??? Не работает эта регулярка во втором случае... что делать...
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)')); |
ну кто нибудь подкиньте регулярку удовлетворяющую условию <p> или <p><b> или сколь угодно html тегов пробовал <\/?\w[^>]*> не работает
|
кто пояснит почему в $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)')); |
ast_ross,
Выразите точно условия |
Нужно заменить часть строки на такую же, только с оберткой типа
<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> Все эти варианты должны быть описаны одной регуляркой. Ну и то же самое только для условия "заканчивается на". |
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,
1. Упрощайте, а не усложняйте задачу, -Очевидно, если К - большая - она в начале предложеия и тогда имеют значения лишь прилежащие теги. 2. Приводите все варианты*никто не будет додумывать - экстраполировать 3. Задача тянет уже на Работу 4. Есть css для первой буквы в теге http://htmlbook.ru/css/first-letter |
Цитата:
|
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>')); |
Deff,
Непонял что тут не корректно? <p><p><span class="highlight"><b>К</b>о</span>роткометражки с ориентацией на классику немой комедии.</p> |
рони,
:yes: Cоррь ....Заглючило воспроизведение в мозгах |
Помогите пожалуйста с регуляркой, я с ними работаю не очень, писалось очень давно и не мной.
В общем суть: 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>')); но в тексте скрипта очень часто используется такая регулярка и хочется цивилизованного способа, знаю что как-то через скобки и символ '|' делается, но экспериментировать на живом сайте боюсь. |
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>')); |
olegsuv,
1. Лучше преобразование строк делать в виде функции на входе строка, на выходе преобразованная строка. 2. Выложите пару примеров входных строк, поскольку надо учитывать возможные внутри лежащие BB и простые теги... |
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 не сильно понял. рони, спасибо за код, попробую |
//Параметры: 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. |