Как стать автором
Обновить
@Full-Rread⁠-⁠only

Пользователь

Отправить сообщение

Пишу только на PHP SPL, не юзаю ни чего стороннего и сразу final классам. Разработчиков моего фреймворка кроме меня ноль поэтому поддерживать сущее удовольствие. Раньше да: война с хренокодом и кучей зависимостей доставляли не мало, но я ушел из программирования как с работы и теперь это хобби и мне спать кто и что критикует в моем подходе к разработке.

Вот только все процессоры, память и прочее для компа спроектировано Американскими компаниями и они имеют полное право регулировать рынок за счёт тех же патентов. В данном случае TSMC не могут себе позволить делать ARM для Huawei, чтобы не получить санкции.

Маскированные хексом символы преобразую в текстовый вид.

Попробую вечером проверить будет ли работать также.

Код уже исправлен на


protected static function hexToSymbols( string $s ): string {

    return preg_replace_callback(

        '/([0-9a-fx]+);?/mi', function( $ord ) {

            $ord = $ord[1];

Тип явно не указываю. Спасибо.

Именно string, а не array. Этот код — это часть модуля для чистки SVG и HTML от XSS и по белому списку атрибутов. Он разворачивает entity's и роется в base64 до второй глубины, чтобы восстановить графику, если в ней найден запрещённый правилами JavaScript.


Используется везде, где разрешен HTML. Например, в письмах.
https://github.com/Full-R/RevolveR-CMF/blob/master/Kernel/Modules/Markup.php


В регулярке, возможно, не так идеально, как хотелось бы, но код работает хорошо.

Вот листинг:

1). В 7.2 под UNIX работало прекрасно

	protected static function hexEntToLetter( string $ord ): string {

		$ord = $ord[1];

		if( preg_match('/^x([0-9a-f]+)$/i', $ord, $match) ) {

			$ord = hexdec($match[1]);

		} 
		else {

			$ord = intval($ord);

		}

		$no_bytes = 0;

		$byte = [];

		if ($ord < 128) {

			return chr($ord);

		}
		else if ($ord < 2048) {

			$no_bytes = 2;

		}
		else if ($ord < 65536) {

			$no_bytes = 3;

		}
		else if ($ord < 1114112) {

			$no_bytes = 4;

		}
		else {

			return ''; 

		}

		switch( $no_bytes ) {

			case 2: 

				$prefix = [ 31, 192 ];

				break;

			case 3: 

				$prefix = [ 15, 224 ];

				break;

			case 4: 

				$prefix = [ 7, 240 ];

		}

		for( $i = 0; $i < $no_bytes; $i++ ) {

			$byte[ $no_bytes - $i - 1 ] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) & 63 | 128;

		}

		$byte[0] = ( $byte[0] & $prefix[0] ) | $prefix[1];

		$ret = '';

		for ($i = 0; $i < $no_bytes; $i++) {

			$ret .= chr($byte[$i]);

		}

		return $ret;

	}

	protected static function hexToSymbols( string $s ): string {

		return preg_replace_callback('/([0-9a-fx]+);?/mi', 'self::hexEntToLetter', preg_replace('/\\\\u?{?([a-f0-9]{4,}?)}?/mi', '$1;', urldecode($s)));

	}


Пришлось сделать не красиво:

	protected static function hexToSymbols( string $s ): string {

		return preg_replace_callback(

			'/([0-9a-fx]+);?/mi', function( $ord ) {

				$ord = $ord[1];

				if( preg_match('/^x([0-9a-f]+)$/i', $ord, $match) ) {

					$ord = hexdec($match[1]);

				} 
				else {

					$ord = intval($ord);

				}

				$no_bytes = 0;

				$byte = [];

				if ($ord < 128) {

					return chr($ord);

				}
				else if ($ord < 2048) {

					$no_bytes = 2;

				}
				else if ($ord < 65536) {

					$no_bytes = 3;

				}
				else if ($ord < 1114112) {

					$no_bytes = 4;

				}
				else {

					return ''; 

				}

				switch( $no_bytes ) {

					case 2: 

						$prefix = [ 31, 192 ];

						break;

					case 3: 

						$prefix = [ 15, 224 ];

						break;

					case 4: 

						$prefix = [ 7, 240 ];

				}

				for( $i = 0; $i < $no_bytes; $i++ ) {

					$byte[ $no_bytes - $i - 1 ] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) & 63 | 128;

				}

				$byte[0] = ( $byte[0] & $prefix[0] ) | $prefix[1];

				$ret = '';

				for ($i = 0; $i < $no_bytes; $i++) {

					$ret .= chr($byte[$i]);

				}

				return $ret;

			}, preg_replace(
	
				'/\\\\u?{?([a-f0-9]{4,}?)}?/mi', 
	
				'$1;', 

				urldecode($s)
	
			)
		
		);

	}


Еще у меня модели сломались. Раньше код не выбрасывал ошибку и исправно работал:

		$user = iterator_to_array(

			$model::get( 'users', [

				'criterion' => 'email::'. $email,

				'bound'		=> [

					1

				],

				'course'	=> 'backward',
				'sort' 		=> 'id'

			]),

		)['model::users'];



Сейчас, видимо, в аргументах нельзя запятую в конце оставлять.

А я всё жду обновления моего Honor 9 до Android 10 и EMUI 10.1.

У меня на 7.4 под Windows перестал работать preg replace callback, если в качестве аргумента указан eval строковое обращение к protected методу этого же класса через self. Пришлось заталкивать всю функцию в аргументы prc.

12 ...
7

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность