Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (69)

Лучшие ответы пользователя

Все ответы (140)
  • Реализация алгоритма нормализации XML для СМЭВ 3?

    IvanU7n
    @IvanU7n
    Для будущих искателей: вот такой монстрик у меня получился (PHP 7.1). Он проходит все проверки из МР 3.5, но, возможно, некоторых нюансов не учитывает.
    <?php
    $in = new DOMDocument();
    $in->load($argv[1]);
    
    $out = new XMLWriter();
    $out->openMemory();
    
    $index = 0;
    $stack = [null, [$in->documentElement, []]];
    while (count($stack)) {
    	$item = array_pop($stack);
    	if ($item === null) {
    		$out->text('');
    		$out->endElement();
    		continue;
    	}
    	[$node, $nsList] = $item;
    	if ($node->nodeType == XML_ELEMENT_NODE) {
    		// Let the magic begin! ;)
    		// The element itself.
    		if ($node->namespaceURI !== null) {
    			$thisLevel = false;
    			if (($nsList[$node->namespaceURI] ?? null) === null) {
    				$thisLevel = true;
    				$nsList[$node->namespaceURI] = 'ns' . ++$index;
    			}
    			$out->startElement("{$nsList[$node->namespaceURI]}:{$node->localName}");
    			if ($thisLevel) {
    				$out->writeAttribute("xmlns:{$nsList[$node->namespaceURI]}", $node->namespaceURI);
    			}
    		}
    		else {
    			$out->startElement($node->localName);
    		}
    		// Attributes.
    		$attrs = iterator_to_array($node->attributes);
    		usort($attrs, function($a, $b) {
    			if ($a->namespaceURI !== null && $b->namespaceURI === null) return -1;
    			else if ($a->namespaceURI === null && $b->namespaceURI !== null) return 1;
    			else return strcmp($a->namespaceURI, $b->namespaceURI) ?: strcmp($a->localName, $b->localName);
    		});
    		foreach ($attrs as $attr) {
    			if ($attr->namespaceURI !== null && ($nsList[$attr->namespaceURI] ?? null) === null) {
    				$nsList[$attr->namespaceURI] = 'ns' . ++$index;
    				$out->writeAttribute("xmlns:{$nsList[$attr->namespaceURI]}", $attr->namespaceURI);
    			}
    		}
    		foreach ($attrs as $attr) {
    			if ($attr->namespaceURI !== null) {
    				$out->writeAttribute("{$nsList[$attr->namespaceURI]}:{$attr->localName}", $attr->nodeValue);
    			}
    			else {
    				$out->writeAttribute($attr->localName, $attr->nodeValue);
    			}
    		}
    	}
    	else if ($node->nodeType == XML_TEXT_NODE && strlen(trim($node->nodeValue))) {
    		$out->text($node->nodeValue);
    	}
    
    	if ($node->lastChild !== null) {
    		$stack[] = null;
    		for ($node = $node->lastChild; $node !== null; $node = $node->previousSibling) {
    			$stack[] = [$node, $nsList];
    		}
    	}
    }
    
    echo $out->outputMemory(), "\n";
    
    ?>
    Ответ написан
    9 комментариев
  • Почему в WP не работает preg_replace или str_replace?

    IvanU7n
    @IvanU7n
    подозреваю, что the_sub_field само делает echo и ничего не возвращает
    найдите функцию, которая возвращает значение, а не выводит его
    Ответ написан
    1 комментарий
  • Почему две строки при загрузки linux?

    IvanU7n
    @IvanU7n
    это, на удивление, меню загрузчика
    избавиться скорее всего никак, т.к. первая по умолчанию должна загружаться, а вторая на всякий случай для восстановления
    Ответ написан
  • Как зарегистрировать register_post_types не нагружая memory size?

    IvanU7n
    @IvanU7n
    бесконечная рекурсия: внутри register_post_types() безусловно вызывается register_post_types()
    вторая регистрация типа поста должна быть register_post_type() без s
    Ответ написан
    1 комментарий
  • Почему выдает ошибку Apache?

    IvanU7n
    @IvanU7n
    ошибка в том, что в VirtualHost указываются ip-адреса и/или порты, для разруливания по доменам используются как раз ServerName и ServerAlias

    т.е. не нужно пытаться запихнуть в VirtualHost доменное имя из ServerName
    Ответ написан
    Комментировать