Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.06.2009, 21:54
Аватар для NightmareZ
Интересующийся
Отправить личное сообщение для NightmareZ Посмотреть профиль Найти все сообщения от NightmareZ
 
Регистрация: 06.08.2008
Сообщений: 21

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

Написал юзерскрипт для форума gamedev.ru, но вот эту подзадачу не могу осилить.
Ответить с цитированием
  #2 (permalink)  
Старый 22.06.2009, 22:16
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

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

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

Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела.
Ответить с цитированием
  #3 (permalink)  
Старый 22.06.2009, 22:17
Аватар для NightmareZ
Интересующийся
Отправить личное сообщение для NightmareZ Посмотреть профиль Найти все сообщения от NightmareZ
 
Регистрация: 06.08.2008
Сообщений: 21

Я не прошу скрипт, я прошу регексп. Это не работа, это десяток символов.
Ответить с цитированием
  #4 (permalink)  
Старый 22.06.2009, 22:36
Аватар для NightmareZ
Интересующийся
Отправить личное сообщение для NightmareZ Посмотреть профиль Найти все сообщения от NightmareZ
 
Регистрация: 06.08.2008
Сообщений: 21

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

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

Или надо как-то иначе?
Можно ли как-то подставить ещё кавычки, etc., но короче.
Ответить с цитированием
  #5 (permalink)  
Старый 22.06.2009, 22:36
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

alert('test :smlie: this :other: one'.replace(/:(\w+):/gi, '*$1*'));
__________________
Тонкости ECMAScript
Ответить с цитированием
  #6 (permalink)  
Старый 22.06.2009, 23:07
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

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

тот регексп, который вы попросили, из разряда прочитать одну статью "регулярки за пять шагов".
если вы считаете свое время слишком дорогим, чтобы посвятить пол часа изучению регулярок, то с чего бы наше время должно ценится дешевле?
извините, но это просто наглость.
Ответить с цитированием
  #7 (permalink)  
Старый 22.06.2009, 23:15
Аватар для NightmareZ
Интересующийся
Отправить личное сообщение для NightmareZ Посмотреть профиль Найти все сообщения от NightmareZ
 
Регистрация: 06.08.2008
Сообщений: 21

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

Приведу фрагмент кода:
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 может быть частью слова, а не смайлом.
Потому я определяю смайл, как фрагмент обрамлённый в пробелы|знаки_препинания|с обки|символы_перевода_стро ки ну и он может находиться либо в начале текста либо в конце.
Ответить с цитированием
  #8 (permalink)  
Старый 22.06.2009, 23:23
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

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

smile - собственно сам смайл
Ответить с цитированием
  #9 (permalink)  
Старый 22.06.2009, 23:37
Аспирант
Отправить личное сообщение для Logo Посмотреть профиль Найти все сообщения от Logo
 
Регистрация: 15.03.2008
Сообщений: 91

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

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

Gvozd
На мой взгляд регекспы проще кода, и уж точно проще сотен строк кода.
Ответить с цитированием
  #10 (permalink)  
Старый 22.06.2009, 23:43
Аспирант
Отправить личное сообщение для Logo Посмотреть профиль Найти все сообщения от Logo
 
Регистрация: 15.03.2008
Сообщений: 91

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java-скрипт для поиска. 2oo Общие вопросы Javascript 25 11.12.2010 12:10
регулярное выражение demi Общие вопросы Javascript 3 10.03.2009 12:10