Ярославль
Ярославль — город, входящий в Золотое кольцо России, наверняка, один из красивейших городов России, жаль у меня не было времени в этом убедиться. Надо будет приехать туда летом.
Ранней осенью, в наших климатических условиях редкий город выглядит достойно. Ярославль под зябким осенним дождём выглядит так же неприглядно, как и любой другой российский город в грязи, мокрых листьях под пасмурным солнцем.
Любить окружающую действительность мне в такую погоду трудно, а город, который в такой момент является частью этой действительности — ещё сложнее. Ярославлю — 1000 лет, об этом в городе написано на каждом столбе, но праздника в городе не ощущается.
Я помню празднование наглого тысячелетия в Казани






Я люблю думать, гуляя по улицам
Кажется, в Ярославле всё те же не прополотые корни прошлого, что и в Москве…




То же народное творчество на стенах…


Те же однообразные и одинаковые по всей стране пятиэтажки и старые дворики…




Те же памятники старины…



То же самое разгильдяйство везде — даже на кладбище…


Конечно, может быть я узнал о том, что не в Москве по многочисленным упоминаниям названия города…


Или по реке, разве река Москва течёт так же несуетно?





Может отличаются люди? Или они везде одинаковые?





Если вы ждёте
Он был не рад мне, а я был не рад промокшим ногам, сырости и холоду. В следующий раз, когда приеду, позвоню заранее, может мы ещё понравимся друг другу.
PHP4 без XML-парсера, плюс XPath
Я недавно написал простенький парсер XML для PHP 4.3+, для случаев, когда никакого встроенного парсера XML на хостинге не оказалось.
Весь XPath я, конечно, реализовывать не буду, да мне столько и не надо. В общем, написал класс, который используется в паре VerySimple_XMLParser. Реализованы получение потомков тега, «*», «node()» и «text()». Это всё, но мне хватит.
// Simple XPath for VerySimple_XMLParser
// /
class VerySimple_XMLParser_Tree
{
var $path;
var $counter;
var $xpath;
function VerySimple_XMLParser_Tree()
{
$this->path = array('/');
$this->counter = 0;
$this->xpath = array();
}
function collect($type, $args)
{
$path = implode($this->path);
switch ($type) {
case 'TEXT':
$this->xpath[$path . $this->counter . '/text()/'] = $args;
$this->counter++;
break;
case 'TAGOPEN':
list($name, $attributes) = $args;
$tag = $this->counter . '/' . $name . '/';
$this->xpath[$path . $tag] = $attributes;
$this->counter = 0;
$this->path[] = $tag;
break;
case 'TAGCLOSE':
$this->counter = 1 + (int) array_pop($this->path);
break;
}
}
function halfxpath($path)
{
$keys = array_keys($this->xpath);
$trans = array(
'\/' => '\/\d+\/',
'\*' => '[^\/()]+',
'node\(\)' => '[^\/]+',
);
$filter = strtr(preg_quote($path, '/'), $trans);
$filtered = preg_grep("/^$filter\/$/su", $keys);
$nodes = array();
foreach ($filtered as $key) {
$nodes[$key] = $this->xpath[$key];
}
return $nodes;
}
}
// а вот так это можно использовать:
$xml =<<<XML
<root>
<a>
<b><c>Xa!</c></b>
<b>Hello</b>
</a>
<a name="value"/>
</root>
XML;
$tree = &new VerySimple_XMLParser_Tree();
$sax = &new VerySimple_XMLParser(array(&$tree, 'collect'));
$sax->parse($xml);
echo '<plaintext>';
var_dump($tree->halfxpath('/*/a/b/text()'));
var_dump($tree->halfxpath('/*/a/b/node()'));
var_dump($tree->halfxpath('/*/a/b/*'));
var_dump($tree->halfxpath('/root/a'));Метод для запросов я назвал «halfxpath», намекая, что это не настоящий XPath, а лишь неполноценная эмуляция.
Основная идея, как видно из кода — не парсить XML в дерево, а помещать каждый элемент по специального вида пути, который потом будет проверен на совпадение по регулярному выражению, приготовленному из запроса.