Во время работы над интерфейсом заимствования я был вынужден решить задачу БЫСТРОГО построения с помощью PHP простейшего книжного библиографического описания, позволяющего идентифицировать книгу. И хотя я являюсь горячим приверженцем PHP, для мне стало абсолютно очевидно насколько уродливым и неэффективным должен быть PHP код, строящий библиографическое описание. Не давали покоя мысли о простоте и лаконичности языка форматирования…
В итоге я пришел к выводу, что гораздо проще написать интерпретатор базовых команд языка форматирования, чем писать код PHP. :)
Привожу код интерпретатора:
function pfte($pft,$occ=1){
if (preg_match_all('{
(?:\'([^\']+?)\')#Безусловный литерал
|
(?:
(?:([\|\"])([^\2]+?)\2)? #Условный литерал слева
(v|d)(\d+)\^?([[:alpha:]]?) #Метка поля
(?:([\|\"])([^\7]+?)\7)? #Условный литерал справа
)
}xi',$pft,$pockets,PREG_SET_ORDER)===false) return '';
$o='';
foreach($pockets as $a){
if ($a[1])
$o.=$a[1];
else {
//FIELD
$f=($a[6])? $this->GetSubField($a[5],$occ,$a[6]): $this->GetField($a[5],$occ);
if ($f && isset($a[3]) && ($a[2]==='|' || $occ==1)) $o.=$a[3];
if (strtolower($a[4])==='v')$o.=$f;
if ($f && isset($a[8]) && ($a[7]==='|' || $occ==1)) $o.=$a[8];
}
}
return $o;
}
$r->GetSubField($a[5],$occ,$a[6]) — получение подполя $a[6] по метке $a[5] с повторением occ
$r->GetField($a[5],$occ) — получение поля $a[5] с повторением occ
В итоге
$r->pfte('v503^a, v700^a" ",v700^b" ",v700^x,," "v970^b,v710^s".",v710^a,". "v710^b,"."d710,v971^b,v461^x" ",", "v461^y,v461^b,v461^c,". "v461^g,": "v461^d,", "v461^h,": "v461^e,". "v200^v":", v200^a, ": "v200^e ,"/"v200^f,". - "v210^d,", "v215^a" c."');
Позволяет получить библиографическое описание вида:
Акулова З.М. Куда пойти учиться?: Информ. - реклам. справ/З. М. Акулова, А. М. Бабич ; ред. А. С. Павловский [и др.]. - 1993, 240 c.
Вывод: язык ИРБИС является самым эффективным средством представления библиографических данных.
PS
Не стоит писать о том, чего здесь не хватает. Это очевидно. Но если у кого-то есть собственные наработки такого рода или идеи относительно того, как решить задачу в меньшем объёме кода — буду очень рад об этом узнать.
Редактировано 2 раз. Последний раз 29.08.2010 03:09 пользователем Кирилл Соколинский (СЗТУ).