Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.11.2018, 18:55
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 1  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
По умолчанию Регулярное выражение для диапазона Юникод

Всем привет!

Столкнулся с проблемой. Регулярное выражение не работает, если нужно искать символы в тексте на соответствие диапазону в Юникоде (т.к. диапазоны наверно работают только для символов)..

Например, регулярка для поиска суррогатных пар - а именно ищу в тексте иконки Эмоджи, которые выходят за пределы базовой мультиязычной плоскости BMP.
Код AS3:
var re:RegExp = new RegExp("([\ud800-\udbff])([\udc00-\udfff])", "g");
Пробую регулярку на JavaScript - работает.
И тут нормально работает


Уже голову ломаю не один день..
Буду признателен за любую подсказку в этом вопросе.

Добавлено через 5 часов 5 минут
Все таки диапазоны для юникода тоже работают.. Ищу в тексте иконку снеговика, которому соответствует код U+26с4 (2 байта)
Код AS3:
var str:String = "Найди ⛄️ меня!";
var re:RegExp = /[\u26c0-\u26cf]/g;
trace(str.match(re)); // выводит иконку снеговика ⛄️
Осталось понять, почему же не срабатывает поиск для более сложных емоджи, которые состоят из пары кодов (4 байта)...
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок экрана 2018-11-21 в 17.57.19.png
Просмотров: 119
Размер:	56.6 Кб
ID:	33311  
__________________
кто не отвечает, того garbage collector забирает


Последний раз редактировалось djken; 22.11.2018 в 18:43.
Старый 22.11.2018, 13:08
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Скинь точный пример того что не работает. И точную регулярку, которую используешь для поиска.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 22.11.2018, 18:39
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 3  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
caseyryan, вот.

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
 
	public class Test extends Sprite
	{
		private var _json:Object;
		private var _text:String;
 
		public function Test()
		{
			var ldr:URLLoader = new URLLoader();
			ldr.addEventListener(Event.COMPLETE, onLoadComplete);
			ldr.load(new URLRequest('https://www.instagram.com/p/xCZYTQLmlB/?__a=1'));
		}
 
		private function onLoadComplete(e:Event):void
		{
			_json = JSON.parse(e.currentTarget.data);
			_text = _json.graphql.shortcode_media.edge_media_to_caption.edges[0].node.text;
			trace(_text);
 
			var re:RegExp;
 
			re = /\u26C4/g; // код иконки снеговика U+26C4
			trace('1', _text.match(re)); // РАБОТАЕТ! Выводит снеговика
 
			re = /[\u26C0-\u26CF]/g; // так же пробуем найти снеговика через диапазон кодов
			trace('2', _text.match(re)); // РАБОТАЕТ! Выводит снеговика
 
			re = /(\ud83c\udf84)/g; // теперь ищем иконку елки U+1F384. Т.к. это больше 2 байт, то записывается суррогатной парой - два подряд идущих кода - 2 старших байта U+D83C и 2 младших U+DF84
			trace('3', _text.match(re)); // РАБОТАЕТ! Выводит елку
 
			re = /([\ud800-\udbff][\udc00-\udfff])/g; //  снова ищем елку, но через диапазон. Диапазон всех суррогатных пар - старший U+D800 - U+DBFF и младший U+DC00 - U+DFFF
			trace('4', _text.match(re)); // НЕ РАБОТАЕТ! Ничего не находит.
		}
	}
}
__________________
кто не отвечает, того garbage collector забирает


Последний раз редактировалось djken; 22.11.2018 в 19:28.
Старый 22.11.2018, 21:54
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Хз как это на 100% проверить, у меня в винде не отображаются эти эмодзи, но
я вижу, что твой код в принципе не может их искать. Если подумать, что он делает? Он пытается найти в однострочном тексте, с учетом регистра, один эмодзи, за которым сразу идет другой. При том ищет он не такую последовательность \ud898\udbff а просто \ud800 за которой идет еще одна такая же.
Сурогатные пары просто так не ищутся.
Попробуй написать так:
Код AS3:
re = /(\\[\w]{5}){2,4}/gi
Поясню что делает эта регулярка. Она ищет последовательность из одного обратного слеша, за которым сразу идут 5 словесных символов (чисел и/или букв). И указанная последовательность должна повторяться от 2 до 4 раз подряд
Получается вот так, если брать конкретно строку из твоего кода. Я не делал проверку именно диапазонов, потому что все равно не смогу проверить, из-за отсутствия эмодзи в тексте не своем компе)
Но если исходный код от инсты именно такой, как в том json, то моя регулярка без проблем его отрабатывает
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_10.png
Просмотров: 34
Размер:	14.5 Кб
ID:	33312  
__________________
Ко мне можно и нужно обращаться на ты)

Старый 22.11.2018, 23:10
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 5  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Да, я понял что твоя регулярка делает, но в ActionScript тоже не работает... В это и проблема.. Почему так? ( Хотя на JavaScript нормально срабатывает и на regex101.com
__________________
кто не отвечает, того garbage collector забирает

Старый 22.11.2018, 23:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Блин, да. Проверил. В as3 сразу парсятся эмодзи.
Сложно определить точный диапазон. На вскидку пришло малость костыльное, но всё же решение
Код AS3:
var regEx:RegExp = /[^\w,.;:!?\s]+/gi;
Просто ищем все то, что не является числом, буквой, знаком препинания или пробелом. И считаем, что это эмодзи.
Можно еще какие-то символы сюда добавить. Проверил, работает в as3
__________________
Ко мне можно и нужно обращаться на ты)

Старый 22.11.2018, 23:49
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 7  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Ура!!! Вот такое решение нашел - работает! Находит все суррогатные пары

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
 
	public class Test extends Sprite
	{
		private var _json:Object;
		private var _text:String;
 
		public function Test()
		{
			var ldr:URLLoader = new URLLoader();
			ldr.addEventListener(Event.COMPLETE, onLoadComplete);
			ldr.load(new URLRequest('https://www.instagram.com/p/xCZYTQLmlB/?__a=1'));
		}
 
		private function onLoadComplete(e:Event):void
		{
			_json = JSON.parse(e.currentTarget.data);
			_text = _json.graphql.shortcode_media.edge_media_to_caption.edges[0].node.text;
			var re:RegExp;
 
			re = new RegExp("[" + generateRangeForUnicodeVariables(0xD800, 0xDBFF) + generateRangeForUnicodeVariables(0xDC00, 0xDFFF) + "]", "gi")
			trace(_text.match(re));
		}
 
		private function generateRangeForUnicodeVariables(var1:Object, var2:Object):String
		{
			return String.fromCharCode(var1) + "-" + String.fromCharCode(var2);
		}
	}
}
__________________
кто не отвечает, того garbage collector забирает

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:59.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.