Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
PHP интерпретатор элементарного ИРБИС формата
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 29, August, 2010 01:36

Во время работы над интерфейсом заимствования я был вынужден решить задачу БЫСТРОГО построения с помощью 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 пользователем Кирилл Соколинский (СЗТУ).

Re: PHP интерпретатор элементарного ИРБИС формата
Пользователь: Vladimir Kim (IP-адрес скрыт)
Дата: 17, February, 2011 16:08

Спасибо, интересный пост!

Позвольте вопрос: у меня почему этот пример все сливает в одну строчку без пробелов, что не так сделал?

С уважением, Владимир Ким
НБ МИФИ

Re: PHP интерпретатор элементарного ИРБИС формата
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 20, February, 2011 10:39

Vladimir Kim написал(а):
-------------------------------------------------------
> Позвольте вопрос: у меня почему этот пример все
> сливает в одну строчку без пробелов, что не так
> сделал?

Проверил, именно этот код сейчас генерирует краткие записи в ИРБИС-корпорации. Формат типа того, который дан в качестве образца должен обрабатываться. Если проблемы с другими форматами, приведите их.

Но учитывайте, что этот код -- очень примитивное средство ;)



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.