Архив за месяц: Ноябрь 2014

1C Выделене подстрок с помощью регулярного выражения

Пример тестировался на 1С 7.7, в 1С 8.х нужно только вместо «СоздатьОбъект» писать «Новый», ну и учитывать тот факт, что в восьмерке есть булев тип данных.

К примеру, перед нами задача, получить номер документа для вывода на печать налоговой накладной. Но в базе документы имеют примерно такие номера «FGT-00072», «AR-00120» и т.д. Если бы до тире было фиксированное число символов, можно было бы брать подстроку по знак «-«, затем брать из строки ту часть, которая стоит за минусом и применять чункцию Число(). В результате получим то, что нужно, то есть «FGT-00072» превратится в 72, а если вместо фиксированной части поиском найти позицию «-«, то и второй номер можно легко преобразовать. Но случаи бывают разные, я предлагаю создать универсальную функцию, с помощью которой вы можете находить любые подстроки, используя регулярное выражение.

Название функции возможно каламбурное, но не будем на это обращать внимание. Она получает текст, регулярное выражение применяемое к этому тексту и номер позиции, которую нужно возвратить.

Пример:

НомДокБН = регВырИгнорРегистр(Строка(«FGT-00072″),»([a-zA-Z]*)-?(0*?)([^0]\d*)»,2); //вернет «72»
ПостфиксБН = регВырИгнорРегистр(Строка(«03″),»(0*?)([^0]\d*)»,1);//Вернет «3» (универсальный убиратель ведущих нулей)

Мне такой подход понравился из-за универсальности, не нужно писать новые циклы и поиски с проверками под разные ситуации. Используем регулярное выражение и всё.

Собственно сама функция

//Выполняет поиск в строке по регулярному выражению
//номер позиции с нуля
//
функция регВырИгнорРегистр (текст, выражение, номерПозиции)
Если (ПустоеЗначение(текст)=1) ИЛИ (ПустоеЗначение(выражение) =1) ИЛИ (ПустоеЗначение(номерПозиции)=1) Тогда
возврат текст;
КонецЕсли;
Истина=-1;
Ложь=0;
RegExp = CreateObject(«VBScript.RegExp»);

RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим

RegExp.Pattern = выражение; //Ищем вхождение
Matches=RegExp.Execute(текст);
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Match = Matches.Item(0);
SubMatches = Match.SubMatches;
SubMatch=SubMatches.Item(номерПозиции);
возврат (SubMatch);
Иначе
возврат «»;
КонецЕсли;
Возврат «»;
КонецФункции

1С 7.7 функция распознавания типа значения

Гениальное просто
Гениальное просто

Эта функция использует регулярные выражения vbscript и может делить любое переданное значение на: целое число, число вообще, дату и строку. Изначально нужно передавать строковой параметр, к примету «12,5», функция вернет «Число», а если передать «12», тогда вернет «ЧислоЦелое»

Возвращает: Определяемый тип, возвращаемый тип — строка. Возможные варианты: «Число», «ЧислоЦелое», «Строка», «Дата».

Обратите внимание, что если передать в качестве параметра строку «12.0», будет возвращен параметр «Число», а не «ЧислоЦелое».

Применение: Я использую для определения типа при чтении данных из различных файлов типа excel, csv или ADO таблиц.

Текст функции:

Функция глОпределитьТипЯчейкиADO(Значение)
//Разделяет типы на строку, число и дату
 Если ПустоеЗначение(Значение)=1 тогда
  возврат 0;
 конецЕсли;
Значение=Строка(Значение);
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");

RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
//есть ли буквы
RegExp.Pattern = "^[-\+]?\d+$";
 Если RegExp.Test(Значение)=Истина Тогда
 Возврат "ЧислоЦелое";
КонецЕсли;
RegExp.Pattern = "^[-\+]?\d*[.,]?[\d]{0,}$"; //число вообще (и целое и со знаками после точки или запятой)
Если RegExp.Test(Значение)=Истина Тогда
 Возврат "Число";
иначе
 RegExp.Pattern = "^\d{1,2}[\.\/-]([0]?\d|1[12])[\.\/-]\d{2,4}$"; //Дата
 //датой считает форматы вида 2.12.2014 , 01.12.14, 3.08.2014, 30-10-2014, 15/12/14 и т.д. первая цифра может быть
 //    одна или две. Цифр года 2, 3 или 4
 если RegExp.Test(Значение) = Истина Тогда
  Возврат "Дата";
 Иначе
  Возврат "Строка";
 КонецЕсли;
КонецЕсли;
КонецФункции

 

php регулярное выражение распознает email

для определения, введен ли правильный адрес email используйте такие регулярные выражения:

Статья была откорректирована и выражения переписаны. Недостатком прошлых выражений являлось то, что строка вида «tw32dream@mail.coca…com.ua» в которой идет три точки подряд тоже считалась правильным адресом электронной почты, что, в принципе нехорошо. Но я тогда ещё не додумался, как исправить данный момент. То есть первую точку после слова mail в нашем примере ещё мог контроллировать, а дальнейшие поддомены теоретически могут быть в любом количестве. Там было сложнее. Теперь эти недостатки исправлены.

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

если допустимы адреса на русском (имеется ввиду кириллица или другие языки, которые не пишутся на латинице)

— если не допускается точка в имени пользователя: мой_login@mail.ru :

^\w+@\w+(\.[\w]+)+$

— если точка в имени пользователя позволена: мой.login@mail.ru :

^[\w.]+@\w+(\.[\w]+)+$

 

если адреса допустимы только на латинице

— если не допускается точка в имени пользователя: my_login@mail.ru :

^[\da-zA-Z_]+@[\da-zA-Z_]+(\.[\da-zA-Z_]+)+$

— если точка в имени пользователя позволена: my.login@mail.ru :

^[\da-zA-Z_.]+@[\da-zA-Z_]+(\.[\da-zA-Z_]+)+$

 

Регулярное выражение ищет адреса изображений в html

(<img)\s+(.*)(src)(\s*)(=)(\s*)([«‘]|)(ftp:\/\/|https?:\/\/|\/)([^'»\s]+)\7(\s*)(.*)>

этот пример для VB, для PHP привожу пример прогаммного кода. Особенностью будет то, что нужно квотировать и символ /, то есть вместо него будет \/

Заметьте, что квантификаторы являются «жадными», поэтому, если изображения размещены по тексту без перевода строк, то браться будет только последнее. Для того, чтобы сделать его «ленивым», добавьте «?» в конце каждого квантификатора!

$res=array();
$regEx = «/(<img)\s+(.*)(src)(\s*)(=)(\s*)([\»‘]|)(ftp:\/\/|https?:\/\/|\/)([^’\»\s]+)\7(\s*)(.*)>/i»;
preg_match_all ($regEx,$txt,$res,PREG_SET_ORDER);

в переменную $res будет помещен двумерный массив с результатом. Подробнее о функции preg_match_all  можно прочесть здесь: http://phpclub.ru/manrus/f/preg-match-all.html

Это окончательный вариант, резличает ftp://, http://, https:// и относительные адреса. В $8 попадает протокол или «/» если это относительный адрес, а в $9 сам url без протокола. URL может быть в одинарных кавычках, двойных кавычках или без кавычек. Исправлен недостаток: если написать такой «неправильный» тег, где адрес взят в кавычки таким образом, что открывается одинарная кавычка, к примеру, а закрывается двойная, этот шаблон воспринимал, как нормальную конструкцию. Теперь это исправлено.

отличным преимуществом является то, что слово » src» (пробел, затем src) могут попадаться внутри тега IMG до собственно того самого src, который и есть адресом. А это может случиться, если такой текст написать например в title илил alt и разместить по тексту перед src. Такие случаи может единичны, может нулевые, но я считаю, что если знаю о недостатке, его следует исключить.

Так что выражение

<img title=»вытяжка адреса из src=» src=»http://my.ru/img/1.jpg» alt=»Ура!»> распознается абсолютно правильно, то есть — $8=http://, $9=my.ru/img/1.jpg

примеры
<img src=»http://my.ru/img/1.jpg» alt=»Ура!»> — $8=http://, $9=my.ru/img/1.jpg

<img src=»https://my.ru/img/1.jpg» alt=»Ура!»> — $8=https://, $9=my.ru/img/1.jpg

<img src=»ftp://my.ru/img/1.jpg» alt=»Ура!»> — $8=ftp://, $9=my.ru/img/1.jpg

<img src=»/img/1.jpg» alt=»Ура!»> — $8=/, $9=my.ru/img/1.jpg

Как использовать регулярное выражение в php, asp, vb и других языках программирования, читайте в соответствующем мануале по этим языкам.

Если хотите сграбить не изображения а ссылки с разделением по протоколу, смотрите мою статью на странице http://www.bobpop.ru/?p=271

Если желаете выразить благодарность в материальном виде, смотрите wm кошельки внизу страницы.

Как воспроизвести музыку в формате dts на компьютере

Я добрый волшебник и избавлю Вас от «брождения» по статьям, перечитывания «мудрых» текстов об устройстве звука dts. Просто сделаю так, что всё это заиграет на все ваши 6 или 8 каналов с сабвуфером! 🙂

Немного лирики вначале (ну, дайте выпендриться человеку). Уж 2 года, как у меня 6-ти канальная аудиосистема с сабвуфером и я периодически почитывал по этому поводу статейки, как использовать её на полную катушку. Самым необычным открытием стал звук в формате DTS. Закрываешь глаза и пропадают стены — ты на настоящем концерте и понимаешь, где стоит каждый инструмент или певец. А электронные «переливы» могут закружить и опрокинуть в бездну.

Вот только у большинства людей, как и у меня вначале, впервые столкнувшихся с этим форматом всё заканчивается шипением, или красивым объёмным шипением, если вы установили и настроили powerDVD, начиная с 14-й версии, указав, что у вас 6-ти канальный звук. Впрочем, это может быть и восьми канальный, тогда шипение ещё «объёмней». По этой причине так же после первых неудач отлаживал «разборку» с этим форматом в течении 2-х лет, считая это делом безнадеждым, списывая на неудачную аудиокарту или другие аппаратные проблемы в компьютере, только вчера сел и дотошно изучил вопрос.

В интернете куча перепечатанных друг у друга статей о том, как устроен DTS формат, и о том, что вам это нужно обязательно знать, прежде чем настроить комп под формат. Вобщем весь тот «багаж знаний», который не нужен ни вам ни мне, простому любителю музыки.

Вобщем суть в том, что у вас не установлен кодек
AC3Filter, который качаем отсюда http://www.ac3filter.net/wiki/Download_AC3Filter. Файл очень маленький и бесплатный. Он может входить в некоторые сборки KLMCodecPack, но вот в мою не вошел. Устанавливаем, не обращаем внимание на попытку «поговорить» с нами по английски, жмем «Ок» или «Next» ну и так далее во всех диалоговых окнах во время установки. Ну, и наслаждаемся объёмным качественным звуком.

Кстати, не в хеллоуин упомянутый выше powerDVD 14(и выше версий) реально улучшает звучание, хотя кажется дальше некуда. Уж простите за дотошность, но имею музыкальное прошлое, играл в группе, ходил на живые концерты, поэтому знаю, как что должно звучать, какие ощущения, когда пребываешь на живом концерте. DTS передает нужную атмосферу рок-концерта, концерта Шиллера или камерного исполнения. Но вот качество немного теряется при декодировании. PowerDVD как раз и «сглаживает» эту потерю… Сравнивал воспроизведение на windows media player и на MPC — моё ухо воспринимает разницу с тем, что выдает PowerDVD, но знакомые не замечают её. Так что смотрите сами, стоит ли устанавливать powerDVD ради небольшого плюса в качестве. Кстати, если решите устанавливать, не забудьте в настройках указать, что это шестиканальный (восми и т.д.) звук.

Удачи!