Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение для поиска смайлов. (https://javascript.ru/forum/misc/4089-regulyarnoe-vyrazhenie-dlya-poiska-smajjlov.html)

NightmareZ 22.06.2009 22:54

Регулярное выражение для поиска смайлов.
 
Помогите, плз, написать регулярное выражения для поиска текстовых смайлов.

Написал юзерскрипт для форума gamedev.ru, но вот эту подзадачу не могу осилить.

Gvozd 22.06.2009 23:16

Вы просите готовый скрипт с нуля.

Это работа, и за нее обычно платят деньги.
Для таких сообщений предназначен раздел форума "Работа".

Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела.

NightmareZ 22.06.2009 23:17

Я не прошу скрипт, я прошу регексп. Это не работа, это десяток символов.

NightmareZ 22.06.2009 23:36

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

Такая запись верна?
new RegExp("\\s|\\(\\)" + smile + "\\s|\\(\\)");

Или надо как-то иначе?
Можно ли как-то подставить ещё кавычки, etc., но короче.

Dmitry A. Soshnikov 22.06.2009 23:36

alert('test :smlie: this :other: one'.replace(/:(\w+):/gi, '*$1*'));

Gvozd 23.06.2009 00:07

Цитата:

Сообщение от NightmareZ
Это не работа, это десяток символов.

регекспы заменяют собой десятки строк кода
а в отладке, особо сложные экземпляры могут достигать сложности эквивалетной даже сотням строк кода

тот регексп, который вы попросили, из разряда прочитать одну статью "регулярки за пять шагов".
если вы считаете свое время слишком дорогим, чтобы посвятить пол часа изучению регулярок, то с чего бы наше время должно ценится дешевле?
извините, но это просто наглость.

NightmareZ 23.06.2009 00:15

Не совсем то. Дело в том, что я не сам определяю смайлы. Я ищу те, которые обычно применяются юзверями, например :) :( ;-) и прочие.

Приведу фрагмент кода:
var smiles = [
    ["http://savepic.ru/708616.gif", ":-)", [":\\)", ":-\\)", "\\(:", "\\(-:"]],
    ["http://savepic.ru/708610.gif", ":-(", [":\\(", ":-\\(", "\\):", "\\)-:"]],
    ["http://savepic.ru/695298.gif", ";-)", [";-\\)", ";\\)", "\\(;", "\\(-;"]],
    ["http://savepic.ru/698376.gif", ":-P", [":-P", ":P", ":-p", ":p"]],
    ["http://savepic.ru/696328.gif", "O_O", ["O_O", "o_o", "OO", "oo"]],
];

var blocks = document.getElementsByClassName('block');
for (b = 0; b < blocks.length; b++)
    for (i = 0; i < smiles.length; i++)
        for (j = 0; j < smiles[i][2].length; j++)
        {
            var sm = smiles[i][2][j];
            var reg = new RegExp("\\.\\,\\(\\)" + sm + "\\.\\,\\(\\)");
            var result = blocks[b].innerHTML.replace(reg, "<img src=\"" + smiles[i][0] + "\" />");
            blocks[b].innerHTML = result;
        }


Т.е. я ищу элементы, определённые в smiles[][2], заменяю их тегами img с href из smiles[][0].
По-идее, найденный текст, например, oo может быть частью слова, а не смайлом.
Потому я определяю смайл, как фрагмент обрамлённый в пробелы|знаки_препинания|с обки|символы_перевода_стро ки ну и он может находиться либо в начале текста либо в конце.

Gvozd 23.06.2009 00:23

оформите те символы, которые могут обрамлять смайл в симфольный класс
типа так:
/[,. \r\n\(\)]smile[,. \r\n\(\)]/

smile - собственно сам смайл

Logo 23.06.2009 00:37

То что перед смайлом - в символьный класс и сохраняющие скобки, то что после - в опережающую проверку. Так
/([,.\s\r\n()])smile(?=[,.\s\r\n()])/

Затем при замене то что в первых скобках ставьте на место, а смайл заменяем.

Gvozd
На мой взгляд регекспы проще кода, и уж точно проще сотен строк кода.

Logo 23.06.2009 00:43

Чуть не забыл -
/([,.\s\r\n()]|^)smile(?=[,.\s\r\n()]|$)/

Добавил возможные начало/конец строки.

З.Ы. есть более тривиальный вариант - \b - граница слова - при этом словами считаются последовательности из букв, цифр и знаков подчеркивания.


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