proft.com.ua [Блог о Web, IT, life]

Регулярные выражения: поиск с инверсией

614 Программирование Комментариев нет

Понадобилось мне найти все слова в предложении, кроме определенных слов. Например, в предложении ‘Many modern computing systems provide wildcard characters in matching filenames from a file system.‘ найти все, кроме слов computing и matching.

Испытуемый текст: ‘Many modern computing systems provide wildcard characters in matching filenames from a file system.
Регулярное выражение: ‘/\b(?!(?:computing|matching)\b)\w+\b/’
Результат: перечень всех слов за исключением computing и matching.

где,
\b – граница слова
\w – набор символов [A-Za-z0-9_]
?: – несохраняющие скобки, т.е. все что внутри группирующих скобок не будет включено в результат
?! – поиск с инверсией, т.е. то, что внутри будет исключено из совпадения

Вообще комбинация ?! называется негативная опережающая проверка и относится к одному из четырех видов позиционных проверок:

Тип Регулярное выражение Успешна, если подвыражение…
Позитивная ретроспективная проверка (?<=..) Может совпасть слева
Негативная ретроспективная проверка (?<!–..) Не может совпасть слева
Позитивная опережающая проверка (?=..) Может совпасть справа
Негативная опережающая проверка (?!..) Не может совпасть справа

Для проверки работы можно воспользоваться:

RegExr – online инструмент для проверки регулярных выражений
Расширением для FireFox Regular Expressions Tester

Полезный материл – RegexAdvice Forums – форум по регулярным выражениям.

Пока читал бестлер про регулярным выражениям – Дж. Фридл – Регулярные выражения узнал две интересные вещи:

  • по спецификации POSIX существует два диалекта регулярок BRE и ERE
  • две базовые технологии, на базе которых строится механизм регулярных выражений: НКА и ДКА

BRE (basic regular expressions) – базовые регулярные выражения
ERE (extened regular expressions) – расширенные регулярные выражения

НКА (недетерминированный конечный автомат) – механизм управляется регулярным выражением
ДКА (детерминированный конечный автомат) – механизм управляется текстом

Поддержка диалектами разных метасимволов

Метасимволы BRE ERE
Точка, ^, $, [..], [^..]
Произвольное число * *
Квантификаторы + и ? +?
Интервальный квантификатор \{мин, макс\} \{мин, макс\}
Группировка \(..\) (..)
Применение квантификаторов к скобкам
Обратные ссылки \1..\9
Конструкция выбора

Краткая таблица сравнения ДКА и НКА

параметры ДКА НКА
поддержка обратных ссылок
сохранение текста в круглых скобках
быстрый поиск совпадений
быстрая компиляция
меньшие затраты памяти

MySQL: Хранимые функции и процедуры

749 MySQL Комментариев нет

Начиная с версии MySQL 5.0 были добавлены хранимые функции и процедуры – набор SQL команд, представляющие собой программную логику сохраняемую в БД, которую в последствии можно будет вызвать.

Преимущества использования:

  • облегчается программная часть разработки, т.к. часть простых действий совершает сама БД
  • написанные функции и процедуры могут быть предварительно скомпилированные, что ускоряет выполнение

Хранимые подпрограммы сохраняются внутри таблицы proc базы mysql.

Для работы с хранимыми подпрограммами необходимы такие привилегии для пользователя: CREATE ROUTINE, ALTER ROUTINE, EXECUTE.

Набор команд используемых вместе с хранимыми подпрограммами:

Название Описание
CREATE PROCEDURE создание процедуры
CREATE FUNCTION создание функции
ALTER PROCEDURE изменение процедуры
ALTER FUNCTION изменение функции
DROP PROCEDURE удаление процедуры
DROP FUNCTION удаление функции
SHOW CREATE PROCEDURE proc_name показать текст процедуры proc_name
SHOW CREATE FUNCTION func_name показать текст функции func_name
SHOW PROCEDURE STATUS LIKE ‘proc_name’ показать характеристики процедуры proc_name
SHOW FUNCTION STATUS LIKE ‘func_name’ показать характеристики функции func_name
CALL proc_name() вызвать процедуру proc_name
DECLARE определение локальных переменных
SET изменение значений локальных и глобальных переменных
SELECT … INTO сохранение значения указанного столбца в переменную
IF условный оператор if-then-else-end
CASE … WHEN оператор выбора
LOOP,REPEAT,WHILE циклы
RETURNS возвращение значения из функции

Создание и изменение переменой:

DECLARE val INT DEFAULT 0;
SET val = 5;

Создание функции:

DELIMITER //
CREATE FUNCTION func() RETURNS INTEGER
BEGIN
DECLARE val INTEGER;
SELECT id INTO val FROM table;
RETURN IFNULL(val, 0);
END//
DELIMITER ;

DELIMITER указывает на символ-разделитель строки с командой, т.к. внутри CREATE FUNCTION есть набор вложенных команд, то для них мы оставляем стандартный разделитель ; а для указания завершения самой CREATE FUNCTION указываем //

Выполнение созданной функции:

SELECT func();

Удаление созданной функции:

DROP FUNCTION IF EXISTS func;

Просмотр хранимых подпрограмм в БД dbname

SELECT ROUTINE_TYPE, ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='dbname';

Дополнительное чтиво:

Звездные войны ASCII вариант

496 Улыбнуло Один комментарий

Смотрим telnet towel.blinkenlights.nl

PS: Для установки telnet под Windows 7 или Windows Vista выполняем в командной строке pkgmgr /iu:TelnetClient или юзаем Putty.

Web Frameworks на Python

512 Python Комментариев нет

10+ Python Frameworks – обзор 10 фреймворков на Python: Django, web2py, Pylons, The Quixote Web Framework, Zope, TurboGears, Webware, CherryPY, Porcupine, Karrigell

В обзоре также есть упоминание о:

  • Drupy – портированние CMS Drupal на Python
  • Zine – блоговый движок

В статье Introducing Three Python Web Frameworks дается ознакомительный обзор с тремя наиболее популярными веб-фреймворками на Python: Django, Pylons и TurboGears.

Offtop: Оказывается на Perl тоже есть веб-фреймворки: Maypole, Catalyst, Jifty, Gantry.

Holovaty and Kaplan-Moss – The Definitive Guide to Django

337 Чтиво Комментариев нет

Название: The Definitive Guide to Django: Web Development Done Right
Авторы: Adrian Holovaty и Jacob Kaplan-Moss
Дата издание: 2008
Страниц: 481

Содержание:

Part 1: Getting Started
CHAPTER 1 Introduction to Django
CHAPTER 2 Getting started
CHAPTER 3 The Basics of Dynamic Web Pages
CHAPTER 4 The Django template system
CHAPTER 5 Interacting with a Database: Models
CHAPTER 6 The Django administration site
CHAPTER 7 Form Processing
CHAPTER 8 Advanced Views and URLconfs

Part 2: Django’s Subframeworks
CHAPTER 9 Generic views
CHAPTER 10 Extending the Template Engine
CHAPTER 11 Generating Non-HTML Content
CHAPTER 12 Sessions, Users, and Registration
CHAPTER 13 Caching
CHAPTER 14 other Contributes Subframeworks
CHAPTER 15 Middleware
CHAPTER 16 Integrating with Legacy Databases and Applications
CHAPTER 17 Extending Django’s Admin Interface
CHAPTER 18 Internationalization
CHAPTER 19 Security
CHAPTER 20 Deploying Django

Part 3: Appendixes
APPENDIX A: Case studies
APPENDIX B: Model Definition Reference
APPENDIX C: Database API Reference
APPENDIX D: Generic View Reference
APPENDIX E: Settings
APPENDIX F: Built-in Template Tags and Filters
APPENDIX G: The django-admin Utility
APPENDIX H: Request and response objects

Книжка написана для версии Django 0.96, а сейчас уже доступна 1.0.2 в которой некоторые моменты поменялись, потому свежую книгу можно найти на The Django Book

Пачка полезностей для JavaScripts #1

462 Java Script Комментариев нет

11 Syntax Highlighters To Beautify Code Presentation – небольшой обзор библиотек подсветки кода. Сами библиотеки украшения синтаксиса реализованы на разных языках JS, PHP, Python, Ruby.

70 New, Useful AJAX And JavaScript Techniques – подборка разных решений на JavaScript’е разбитое по группам: календари, навигация, подсказки, меню, ползунки, слайд-шоу, обрезка изображений, предпросмотр изображений, загрузка файлов, завершение слов, формы, таблицы, ajax,

Best JavaScript Tree Widgets – обзорчик 9 виджетов для реализации древовидной структуры. В список попали: ExtJS TreePanels, QooXdoo Tree Widget, jsTree, TreeView, Destroydrop, jQuery File Tree, jQuery Simple Tree, DHTML TreeView, Graphic JavaScript Tree with Layout

Creating pseudo 3D games with HTML 5 canvas and raycasting: Часть 1 Часть 2 – создание псевдо 3D игры с использованием объекта canvas и рейкастинг.

JavaScript Gaming – каталог игр написанных на JavaScript

The Sexy Curls jQuery Plugin – реализация загибающегося уголка страницы, под которым видно, например, другую страницы.

DataTables – расширяем возможности таблиц: сортировка, фильтрация, загрузка данных через AJAX, настройка отображения с помощью CSS и т.д.

A jQuery inline form validation, because validation is a mess – симпатичные алерты для полей формы необходимых для заполнения

Star Rating widget – довольнатаки функциональные рейтинг на jQuery

meioMask – jQuery плагин для добавления маски ввода в поля input

jQuery Datepicker – удобный календарик для заполнения полей с датой

jGrowl – всплывающий сообщения, наподобие Growl из OS X

wTooltip – легкие и гибкие подсказки (tooltip)

Clientcide Libraries for MooTools – подборка расширений для MooTools, есть классы для работы с объектом Browser, элементами на странице, UI, слоями, формами, эффектами и т.д.

Lazy – загрузка jQuery плагинов по требованию (lazy load), понимает зависимости

ie7-js – прививаем Internet Explorer’у поведение совместимое со стандартами. Обещают исправление многих HTML и CSS ошибок, в том числе прозрачность PNG.

Серфим по XHTML/XML с помощью XPath и PHP

344 PHP Комментариев нет

Для разбора (парсинга) файла с XHTML/XML можно использовать regexp, но результат получится не быстрым и не надежным, т.к. структура документа может минется и для составления хорошего regexp’a придется поломать голову. И тут на выручку приходит XPath, который позволяет легко выбирать из XHTML/XML значения внутри тегов, атрибутов, составляя запросы. Метод чем-то похож на роботу с записями в БД.

В PHP для этого нам понадобится объект класса DOMDocument, который будет хранить структуру документа и DOMXPath, который будет выполнять запрос на поиск нужного значения.

Пример ниже показывает обращение к вымышленной странице, на которой есть таблицей с семью столбцами. Запрос выбирает текстовое значение шестого столбац из строки, css-класс которой имеет значение status1:

$doc = new DOMDocument();
$doc->loadHtmlFile('path/to/file/or/page');
$xpath = new DOMXPath( $doc );
$cell = $xpath->query("//table/tr[@class='status1']/td")->item(6)->nodeValue;

Если вы с XPath не очень знакомы, а нужно выбрать конкретный элемент с страницы и потом обработать в PHP, то для Firefox есть два расширения:

Дополнительное чтиво:

  1. PHP XPath Tutorial – Advanced XML Part 1
  2. A guide to using XPath with PHP to scrape web pages
  3. Web scraping with PHP and XPath
  4. Примеры по DOMDocument и DOMXPath
  5. Хорошее описание XPath

Наткнулся на библиотеку FluentDOM предоставляет интерфейс для работы с DOMDocument, сам способ роботы с документом похож на аналогичный из jQuery.

Вот простой пример с сайта разработчика:

require_once('../FluentDOM.php');
echo FluentDOM($xml)
->node(
FluentDOM($samples)
->find('//b[@id = "first"]')
->removeAttr('id')
->addClass('imported')
)
->replaceAll('//p');

Что сказать? Удобно, вроде многофункционален, честно признаться пока сам не пробовал, но пример многообещающий :)

jQuery: Прокручивание страницы

485 Java Script 2 комментария

Для прокручивания экрана к необходимому элементу на странице можно воспользоваться следующим снипетом на jQuery:

$('body').animate({scrollTop: $('#target').attr('offsetTop')}, 0);

где #target – id целевого элемента

Если понадобится более гибкие возможности, то можно воспользоваться плагином jQuery.ScrollTo (Демо), который позволяет прокручивать по вертикале и горизонтали, на определенную величину (процент или пиксель).

Standard PHP Library (SPL)

505 PHP Комментариев нет

SPL добавляет в PHP новые возможности ООП для работы с :

  • итераторами;
  • новые виды исключений;
  • перегрузка (overloading) массивов,
  • расширенное управление XML, файлами и данными
  • паттерн Наблюдатель, интерфейс Исчисления (counting)
  • автоматическая загрузка классов и интерфейсов

PHP поддерживает SPL начиная с версии 5.2.1.

Примеры использования некоторых новых классов и интерфейсов:

ArrayIterator - позволяет создать итератор из любого массива:

$arr = array('a','b','c');
$iterator = new ArrayIterator($arr);
foreach($iterator as $val) {
echo $val;
}

LimitIterator - задание границ для итератора, первый параметр – массив, второй – индекс первого элемента, третий – количество элементов

$arr = array(1,2,3,4,5,6,7,8,9);
$arrIterator = new ArrayIterator($arr);
$limitIterator = new LimitIterator($arrIterator, 3, 4);
foreach($limitIterator as $number) {
echo $number;
}

AppendIterator - объединяет два итератора

$arrFirst = new ArrayIterator(array(1,2,3));
$arrSecond = new ArrayIterator(array(4,5,6));
$iterator = new AppendIterator();
$iterator->append($arrFirst);
$iterator->append($arrSecond);
foreach($iterator as $number) {
echo $number;
}

FilterIterator - фильтр по вычисляемому значению

class GreaterThanThreeFilterIterator extends FilterIterator {
public function accept() {
return ($this->current() > 3);
}
}
$arr = new ArrayIterator(array(1,2,3,4,5,6));
$iterator = new GreaterThanThreeFilterIterator($arr);
print_r(iterator_to_array($iterator));

RegexIterator - филтр по regexp значения

$arr = array('apple','avocado', 'orange', 'pineapple');
$arrIterator = new ArrayIterator($arr);
$iterator = new RegexIterator($arrIterator, '/^a/');
print_r(iterator_to_array($iterator));

SPL также предоставляет возможность для управления содержимым файлов и списком директорий.

Получение свойств файла

$fileName = '/path/to/file/filename.php';
$fileInfo = new SPLFileInfo($fileName);
$fileInfo->getPath();
$fileInfo->getSize();
$fileInfo->isFile();
$fileInfo->isDir();

Просмотр содержимого директории:

DirectoryIterator
$pathName = '/path/to/iterate/';
foreach(new DirectoryIterator($pathName) as $fileInfo) {
echo $fileInfo . "\n";
}

Рекурсивный просмотр содержимого директории:

RecursiveDirectoryIterator
$pathName = '/path/to/root/dir/';
$i = new RecursiveDirectoryIterator($pathName);
foreach(new RecursiveIteratorIterator($i) as $fileInfo) {
echo $fileInfo . "\n";
}

Построчная итерация по файлу:

$it = new SplFileObject('pm.csv');
foreach($it as $line) {
echo $line;
}

Дополнительный материал:

Smarty – монстр шаблонов для PHP

530 PHP Комментариев нет

Раньше некогда не пользовался Smarty, считал его через чур перегруженным излишествами и медленным, как наверное многие кто начинал изучать PHP с разработки своей CMS _Wetas_ и писал свои template движки. Помню, как сначала использовал функцию str_replace, в которую передавал набор значений и текст файла с шаблоном. Но бегать по всему тексту и искать место для вставки не лучший способ реализации, особенно если этих мест для вставки много и шаблон большой, потому со временем поменял этот способ на другой, более шустрый. Подгружал файл с шаблоном в локальное пространство парсера, в котором уже был готов набор значений для вставки, сами значения хранились в массиве, весь вывод был между ob_start и ob_end_clean, потом заполненный и готовый шаблон отдавался браузеру.

Но на днях, в одном из новых проектов, все шаблоны были сделаны на Smarty и от меня требовалось добавить новый модуль, который выводил бы результат в темплейт с Smarty – пришлось познакомится с этим монстром.

А начнем мы с возможностей:

  • достаточный набор встроенных команд – конструкции для условного выполнения и циклического перебора данных
  • компилирование шаблонов – конвертирование шаблонов в сопоставимый PHP скрипт
  • кэширование шаблонов – моментальное отображение, без рендринга
  • настраиваемые и расширяемые возможности – ООП архитектура позволяет расширять возможности Smarty

Скачиваем и устанавливаем Smarty.

Подключение:

Подключить Smarty к работающему проекту можно двумя способами:

  1. Через константу SMARTY_DIR, указав путь
  2. Обычным способом, указав путь в include_path

Структура директорий, используемая Smarty

templates – тут лежат все шаблоны.
configs – содержит специфические настройки Smarty для текущего сайта.
templates_c – содержит шаблоны, скомпилированые Smarty.
cache – содержит закишированые теплейты (если включено кэширование)

Путь к этим директориям можно поменять, изменив значения следующих атрибутов класса Smarty: $template_dir, $compile_dir, $config_dir, $cache_dir .

Пример использование:

Текст шаблона приведен ниже, назовем файл, например, welcome.tpl и закидываем в папку templates.

<html>
<head>
<title>{$title}</title>
</head>
<body>
<p>Hello, {$user_name}. Welcome to the wonderful world of Smarty.</p>
</body>
</html>

Создаем php-файл, в который помещаем такой код:

require("Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("name", "Agent 007");
$smarty->assign("title", "Welcome!");
$smarty->display("welcome.tpl");
?>

Любая переменная в шаблоне может иметь модификатор, который заданным способом меняет значение, хранящиеся в этой переменной.

Пример применения: {$var|modifier}
Возможные значения: capitalize, count_words, date_format, default, strip_tags, truncate.

Управляющие конструкции

Условный оператор if-elseif-else

{if $dayofweek > 5}
Выходные!
{/if}

Оператор цикла foreach. Код с контролером:

require("Smarty.class.php");
$smarty = new Smarty;
$daysofweek = array("Пн","Вт","Ср","Чт","Пт","Сб","Вс");
$smarty->assign("daysofweek", $daysofweek);
$smarty->display("daysofweek.tpl");

Текст шаблона:

{foreach key=key item=item from=$daysofweek}
{$key}: {$item}
{foreachelse}
Значения не найдены.
{/foreach}

Дополнительное чтиво: Официальная документация по Smarty на русском.

Страница 2 из 21«12345»...Последняя »

Powered by WordPress