PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (12): « 1 [2] 3 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 166
Doox911 Отправлено: 08 Августа, 2018 - 07:49:16 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Мелкий пишет:
Ответ простой: да, чтобы не было граблей всё должно быть в utf8. utf8_general_ci - это collate в mysql для utf8

Ответ правильный:
Doox911 пишет:
Т.е. корректно будет работать если html, скрипты и база в UTF-8?

Для PCRE будет уже достаточно если поисковый паттерн и текст в котором ищем в UTF8, всё остальное может быть в других кодировках.
В рамках своего проекта чтобы не иметь головной боли с кодировками - да, использовать utf8. При необходимости в общении с внешними системами на каких-то других кодировках - перекодируйте данные через iconv или mb_convert_encoding сразу при приёме данных.

Doox911 пишет:
UTF-8 и utf-8_general_ci одно и тоже?

Скорей всего речь о mysql и тогда правильный ответ будет на настоящее время - лишь частично.
utf8_general_ci - это правила сравнения и сортировки для utf8, данные для этого соответственно лежат в utf8. А дальше исторический казус:
Изначально utf8 был от 1 до 6 байт на символ, но в mysql решили что им хватит 3 байт и тихо ломали не влезающие в 3 байта символы.
Потом utf8 стандарт урезали до 4 байт максимум.
Потом в Mysql 5.5.(что-то) сделали грубый костыль - кодировку названную utf8mb4, который в отличии от исторически дефектного в mysql utf8 умеет в 4 байт на символ и соответствует стандарту. В будущем в mysql алиас кодировки utf8 планируют переключить с utf8mb3 на utf8mb4. Но до тех пор - utf8 как стандарт и utf8 как кодировка в mysql совпадают только на 75%.


Спасибо (уже и кликнул). Очень подробно и понятно. Теперь есть понимание. В целом в двух проектах я использую везде только utf8. Получается конвертировать мне необходимо только если я например использую стороннее api или работаю с пользовательским файлом?
Doox911 Отправлено: 07 Августа, 2018 - 11:18:19 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Мелкий пишет:
Doox911 пишет:
сама поймёт в какой кодировке сравнивать

Это в принципе невозможно.
Если кодировка текста не известна заранее - то её можно пытаться только угадать. Потому что байты-то везде одни и те же, а кодировок - суть таблиц преобразования произвольного байта в представление на экране - огромное множество наплодили.

Флаг u подписан в мануале и маппится в коде в PCRE_UTF8, т.е. регулярка будет работать исходя из предположения, что и паттерн и текст переданы в utf8

Т.е. корректно будет работать если html, скрипты и база в UTF-8? UTF-8 и utf-8_general_ci одно и тоже?
Doox911 Отправлено: 07 Августа, 2018 - 09:47:26 • Тема: Посоветуйте конфигурацию сервера для большого сайта с поиском. • Форум: Администрирование *nix

Ответов: 6
Просмотров: 2393
supmener пишет:
С MySQL? А как заливать в неё директорию с подпапками, в которых txt файлы?
Почему txt файлы? А не паттерн на php?
Doox911 Отправлено: 07 Августа, 2018 - 08:27:17 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Т.е. получается при добавлении модификатора u регулярка сама поймёт в какой кодировке сравнивать? Или будет сравнивать исходя из того что в скрипте предполагается, что символ пришел в кодировке utf8 и скрипт сохранён в той же кодировке?
Doox911 Отправлено: 07 Августа, 2018 - 08:13:05 • Тема: 404 ошибка. Хотя файлы все на месте. • Форум: Администрирование *nix

Ответов: 0
Просмотров: 1375
Не могу настроить виртуальные хосты nginx на Ubuntu 18. Настроил php. Сайт написан на модели MVC. На сторонних серверах типо reg.ru всё работает. На моём сервере обычные php фалы работают. Работает phpmyadmin. А вот сайт (другой адрес) не хочет. В логах nginx пусто (/var/log/nginx) - ошибок нет. Устанавливал пакет nginx full вроде. В файле hosts прописал ip:
PHP:
скопировать код в буфер обмена
  1.  
  2. 127.0.0.1       localhost
  3. 127.0.0.1       dealer
  4.  
.
в папке sites-available два файла: dealer, default.
dealer:
PHP:
скопировать код в буфер обмена
  1.  
  2. server {
  3.    listen 80 default_server;
  4.    listen [::]:80 default_server ipv6only=on;
  5.  
  6.    root /var/www/html/dealer/html;
  7.    index index.php index.html index.htm;
  8.  
  9.    server_name dealer;
  10.  
  11.    location / {
  12.            # First attempt to serve request as file, then
  13.            # as directory, then fall back to displaying a 404.
  14.            try_files $uri $uri/ =404;
  15.    }
  16.  
  17.    # pass PHP scripts to FastCGI server
  18.   #
  19.   location ~ \.php$ {
  20.            include snippets/fastcgi-php.conf;
  21.  
  22.            # With php-fpm (or other unix sockets):
  23.            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
  24.            # With php-cgi (or other tcp sockets):
  25.  
  26.    }
  27. }
  28.  

default:
PHP:
скопировать код в буфер обмена
  1.  
  2. server {
  3.         listen 80;
  4.         listen [::]:80;
  5.  
  6.         root /var/www/html/localhost/html;
  7.         index index.php index.html index.htm;
  8.  
  9.         server_name localhost;
  10.  
  11.         location / {
  12.                 try_files $uri $uri/ =404;
  13.         }
  14.  
  15.         location ~ \.php$ {
  16.                 include snippets/fastcgi-php.conf;
  17.                 fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
  18.         }
  19. }
  20.  

в папке sites-enabled так же два файла с аналогичным содержанием. Но это вроде какие-то ссылки.
Почему выскакивает ошибка 404?
Doox911 Отправлено: 27 Июля, 2018 - 12:55:50 • Тема: работа с Comoser • Форум: Работа с файловой системой и файлами

Ответов: 1
Просмотров: 1480
Вроде разобрался. В каждом проекте создаём свой файл composer.json. Из терминала или командной строки переходим в папку проекта. И в нём запускаем(локально установлен):
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. php composer update
  3.  

Вроде всё ок работает)
Doox911 Отправлено: 27 Июля, 2018 - 09:41:26 • Тема: работа с Comoser • Форум: Работа с файловой системой и файлами

Ответов: 1
Просмотров: 1480
Установил composer глобально (Ubuntu):
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. /usr/local/bin/composer
  3.  

У меня 2 проекта. Они расположены не в (doox911 - это профиль):

а по разным путям. Как мне их файлы (composer.json) обновлять?
Doox911 Отправлено: 20 Июля, 2018 - 07:00:03 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Мелкий пишет:
Doox911 пишет:
\xd1\x82 - этo байты?

Это байты в распространённой hex записи.
Пользуясь какой-нибудь таблицей кодирования можно попробовать представить в виде символов.
Для utf8 это будет один символ т, для cp1251 - строка из двух символов: "С‚", строка "Ń‚" в cp1250 и так далее по куче разных кодировок с различным эффектом.

Doox911 пишет:
Не совсем понял что за d0 b0:

Тоже байты в hex виде. Без \x и с пробелами обычно читается легче человеком.


Тогда, я так понимаю, из массив и предыдущей темы мне надо видо изменить.
http://forum.php.su/topic.php?fo...58715#1532058715
PHP:
скопировать код в буфер обмена
  1.  
  2. $alfavit = array (' ','А','а','Б','б','В','в','Г','г','Д','д','Е','е','Ё',
  3.                          'ё','Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м',
  4.                          'Н','н','О','о','П','п','Р','р','С','с','Т','т','У','у','Ф',
  5.                          'ф','Х','х','Ц','ц','Ч','ч','Ш','ш','Щ','щ','Ъ','ъ','Ы','ы',
  6.                          'Ь','ь','Э','э','Ю','ю','Я','я','0','1','2','3','4','5','6','7','8','9');
  7.  

Заменить на символы коды символов:
https://www[dot]utf8-chartable[dot]de/un[dot][dot][dot]nicodeinhtml=hex
взяв коды символов и сними сравнивать?
Doox911 Отправлено: 20 Июля, 2018 - 06:51:55 • Тема: Почему в режиме $strict in_array не верную кодировку? • Форум: Вопросы новичков

Ответов: 8
Просмотров: 459
armancho7777777 пишет:
Doox911 пишет:
Но как тогда остаются только кириллические символы?
armancho7777777 пишет:
preg_replace

Удалит всё, что не входит в исключение.
CODE (text):
скопировать код в буфер обмена
  1. "/[^а-яё\d ]/ui" -> ""

Понял. Спасибо!
Doox911 Отправлено: 18 Июля, 2018 - 12:16:40 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Мелкий пишет:
Зависит от того что считать корректным. С точки зрения механики - все результаты корректны.

Мелкий пишет:
var_dump(preg_match("~[абв]~", "где"));

Обозначу для краткости символы:
а состоит из байтов 1 и 2 (реально d0 b0)
б - 1 и 3 (d0 b1)
в - 1 и 4 (d0 b2)
г - 1 и 5 (d0 b3)
д - 1 и 6 (d0 b4)
е - 1 и 7 (d0 b5)
да, d0 у них у всех реально совпадает. В итоге получаем без модификатора u выражение:

Именно так, сравниваем байты, в символьной маске не 3 объекта для сравнения, а 6, из них 3 одинаковые. Есть у нас байт 1? Есть, потому и получаем совпадение.

С модификатором u рассматриваем именно символы, потому в символьной маске будет только 3 объекта. И соответственно отсутствие совпадения.

Doox911 пишет:
при перемене мест символов?

При перемене мест байт. Я специально воспользовался hex записью чтобы проиллюстрировать и дописал комментарий, что такая изменённая последовательность байт вообще недопустима в utf8.


С точки зрения механики - бесспорно).

Я что-то запутался.
\xd1\x82 - этo байты? Или символы? Я предполагаю, что это символы "," и "С".

Не совсем понял что за d0 b0:
http://fkn[dot]ktu10[dot]com/?q=node/5542 Hex-16?
Doox911 Отправлено: 18 Июля, 2018 - 11:57:42 • Тема: Почему в режиме $strict in_array не верную кодировку? • Форум: Вопросы новичков

Ответов: 8
Просмотров: 459
Строитель пишет:
Шаблон [^а-яё\d ] можно прочитать так:

Найдено совпадение, если текущий символ НЕ соответствует набору символов, перечисленному в символьном классе [...]

Т.е., поиск успешен, если текущий символ: НЕ кириллическая буква, НЕ цифра, НЕ пробел (хотя пробелы лучше обозначать с помощью символьного класса \s)


Абсолютно согласен. Но как тогда остаются только кириллические символы?
Doox911 Отправлено: 18 Июля, 2018 - 11:51:14 • Тема: Как лучше производить валидацию? • Форум: Вопросы новичков

Ответов: 9
Просмотров: 279
Мелкий пишет:

Не понял вопроса.


Как происходит сравнения символов? Например вот так:


Unicod это не кодировка, а стандарт?
Doox911 Отправлено: 18 Июля, 2018 - 11:23:58 • Тема: Как лучше производить валидацию? • Форум: Вопросы новичков

Ответов: 9
Просмотров: 279
Мелкий пишет:
Для UTF8 как представителя кодировки с переменной шириной символа в принципе нет возможности взять произвольный i-тый символ строки без просмотра всех символов от 0 до i, что ожидаемо даёт замедление алгоритма.

Поясню как раз на замечательном примере из другой вашей темы: http://forum.php.su/topic.php?fo...87399#1531887399
Ваш алгоритм некорректно обрабатывает символы utf8. Но сама идея байтового обхода исходной строки при этом корректна.
Пример armancho7777777 получит замедление потому что в принципе невозможно получать offset в mb_substr без полного просмотра этого самого offset. На каждой итерации цикла.

Корректно обходить кодировки переменной длины - это взять следующий байт строки, если это не полный символ кодировки - брать следующие байты. Когда собрали символ - сверять полученный символ с заданной символьной маской. Если есть совпадение, то берём следующий байт и собираем новый символ и проверяем уже его. Если не совпали - ура, выходим, под шаблон строка не подпадает. Именно так работает PCRE и вообще конечные автоматы регулярных выражений.

В возможность корректно обойти utf8 в userspace php и обогнать элементарную регулярку - я не верю. Проверять лениво, много граблей обходить надо. А производительность libpcre в PHP ещё и весьма непросто корректно проверять из-за кеша регулярок в нескромные 4096 штук. Ёпт, а там ещё и JIT включен уже может быть. Это без вариантов, по крайней мере пока для userspace не прикрутят JIT.


т.е. когда я беру символ и сравниваю именно как символ и знаю что символ в utf-8 php всё равно не понимает его код? Он всегда сравнивает по битно? И что значит utf-8, что резиновая? utf-16 2 я так понимаю строго 2 байта = 16 бит.
Doox911 Отправлено: 18 Июля, 2018 - 11:13:17 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Мелкий пишет:
Потому что регулярка - это весьма глупый конечный автомат. Без модификатора u в действии бинарное сравнение.

PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match('~[а-яё]~', "\x82\xd1"));
  2. var_dump(preg_match('~[а-яё]~', "\xd1\x82"));
  3. var_dump(preg_match('~[а-яё]~u', "\x82\xd1"));
  4. var_dump(preg_match('~[а-яё]~u', "\xd1\x82"));

Какие будут результаты, если заведомо известно, что UTF8 символ кириллицы "т" - это hex число d1 82, а число 82 d1 недопустимо для utf8.

Ну и показательнее будет:
PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match("~^[т]$~u", "\xd1\x82"));
  2. var_dump(preg_match("~^[т]$~u", "\x82\xd1"));
  3. var_dump(preg_match("~^[т]$~", "\xd1\x82"));
  4. var_dump(preg_match("~^[т]$~", "\x82\xd1"));

Становится очевидно, почему ^т$ и ^[т]$ ведут себя различно в зависимости от u?

Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения.
(Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:


Если я правильно понял, то результат не корректный при перемене мест символов? И очень странно сто без модификатора u находит.
Doox911 Отправлено: 18 Июля, 2018 - 08:55:29 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 21
Просмотров: 823
Строитель пишет:
Doox911 пишет:
А юникод потому что некоторые русские символы не влезли?
u - потому что работаете с многобайтовой кодировкой. Но есть случаи, в которых при работе с юникодом, модификатор u можно не указывать - обычно это когда в шаблоне искомое слово прописано как есть. Сравните эти два примера:
Спойлер (Отобразить)


Интересно. А почему так?

Страниц (12): « 1 [2] 3 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB