PHP.SU

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

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

> Найдено сообщений: 144
Doox911 Отправлено: 20 Июля, 2018 - 07:00:03 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 16
Просмотров: 121
Мелкий пишет:
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
Просмотров: 87
armancho7777777 пишет:
Doox911 пишет:
Но как тогда остаются только кириллические символы?
armancho7777777 пишет:
preg_replace

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

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

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

Мелкий пишет:
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
Просмотров: 87
Строитель пишет:
Шаблон [^а-яё\d ] можно прочитать так:

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

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


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

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

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


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


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

Ответов: 9
Просмотров: 76
Мелкий пишет:
Для 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 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 16
Просмотров: 121
Мелкий пишет:
Потому что регулярка - это весьма глупый конечный автомат. Без модификатора 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 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

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


Интересно. А почему так?
Doox911 Отправлено: 18 Июля, 2018 - 07:57:54 • Тема: Как работает эта регулярка? • Форум: Вопросы новичков

Ответов: 16
Просмотров: 121
Строитель пишет:
Doox911, для такого шаблона /[А-ЯЁа-яё]+/iu указывать регистронезависимый модификатор i как-то бессмысленно ... Можно сократить запись:
/[а-яё]+/iu

Да согласен. На просторах рунета пишут как я))) Наверно такие же умельцы..
А юникод потому что некоторые русские символы не влезли?
Doox911 Отправлено: 18 Июля, 2018 - 07:41:59 • Тема: Форма добавления комментариев • Форум: Вопросы новичков

Ответов: 5
Просмотров: 124
Andry пишет:
Не могу сообразить как реализовать привязку id статьи с id комментария, подскажите пожалуйста что я не так сделал и как мне исправить положение)

PHP:
скопировать код в буфер обмена
  1.  
  2. $db = new PDO('mysql:host=localhost;dbname=monorailsbase', 'root', '');
  3. $db->exec("SET NAMES UTF8");
  4.  
  5. if(count($_POST) > 0){
  6.  $name = trim($_POST['name']);
  7.  $text = trim($_POST['text']);
  8.  $mail = trim($_POST['mail']);
  9.  $id_page = $_GET['id'];
  10.  
  11.  $text = htmlspecialchars($text);
  12.  $name = htmlspecialchars($name);
  13.  $mail = htmlspecialchars($mail);
  14.  
  15.  if($name != '' && $text != '' && $mail != '') {
  16.   $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  17.  
  18.   $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  19.   $query->execute($params);
  20.   exit(0);
  21.  }
  22. }
  23.  $id_page=$_POST['id_page'];
  24.  $id_page = "%$id_page%";
  25.  $query = $db->prepare("SELECT * FROM comment_form WHERE id_page LIKE ?");
  26.  $query->execute(array($id_page));
  27.  $comments = $query->fetchAll();
  28.  


CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post" action="/articles/article.php?id=<?php echo $_GET['id'];?>" class="comment-form">
  3. <h3>Leave A Message</h3>
  4. <div class="row">
  5. <div class="form-group col-md-6">
  6. <input type="text" name="name" placeholder="Your Name*" class="form-control" value="<?php echo $name;?>">
  7. </div>
  8. <div class="form-group col-md-6">
  9. <input type="text" name="mail" placeholder="Email Addr" class="form-control" value="<?php echo $mail;?>">
  10. </div>
  11. <div class="form-group col-md-12">
  12. <textarea name="text" placeholder="Your Comment*" rows="8" class="form-control" value="<?php echo $text;?>"></textarea>
  13. </div>
  14. <input type='hidden' name='id' value="<?=$id_page;?>\">
  15. <input type="submit" value="Submit Comment" name="Submit Comment" title="Submit Comment"/>
  16. </div>
  17. </form>
  18.  

1. Где не можете сделать привязку БД, скрипт?
2. Я бы в шаблоне проверял переменные на существование перед выводом!
PHP:
скопировать код в буфер обмена
  1.  
  2. <input type="text" name="name" placeholder="Your Name*" class="form-control" value="<? if isset ( $name ) { echo $name; } ?>">
  3.  

3. И зачем вы тут используете exit(0)? и как в вашем понимании он должен работать?
PHP:
скопировать код в буфер обмена
  1.  
  2.  if($name != '' && $text != '' && $mail != '') {
  3.   $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  4.  
  5.   $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  6.   $query->execute($params);
  7.   exit(0);
  8.  }
  9. }
Doox911 Отправлено: 18 Июля, 2018 - 07:34:46 • Тема: Как лучше производить валидацию? • Форум: Вопросы новичков

Ответов: 9
Просмотров: 76
Мелкий пишет:
Берите профилировщик и сравните. Что быстрее, вызов скомпилированной libpcre или userspace реализация. Замечательное место где можно сильно просесть алгоритмически и не заметить - как выбирается следующий символ сравниваемой строки.


Не совсем понял, в каком месте просесть можно алгоритмически?
Doox911 Отправлено: 18 Июля, 2018 - 07:16:39 • Тема: Почему в режиме $strict in_array не верную кодировку? • Форум: Вопросы новичков

Ответов: 8
Просмотров: 87
Vladimir Kheifets пишет:

Причина в том, Вы выбираете по одному байту, а для каждый символа кириллицы в UTF-8 нужно выбирать по 2 байта и для строки "АаБбВв" strlen выдаёт значение 12, а не 6.
Спойлер (Отобразить)
Удачи!


О_о! Спасибо! Для кирилици получается два байта.
(Добавление)
armancho7777777 пишет:
PHP:
скопировать код в буфер обмена
  1. $word = 'Привет';
  2. $len = mb_strlen($word, 'UTF-8');
  3.  
  4. for($i=0; $i < $len; $i++) {
  5.     echo mb_substr($word, $i, 1, 'UTF-8'), "\n";
  6. }
  7.  

А вообще, Вашу задачу можно решить одной строкой кода:
PHP:
скопировать код в буфер обмена
  1. $clear_string = preg_replace (["/[^а-яё\d ]/ui", "/ +/"], ["", " "], $word);


Я вот покурил мануалы и не совсем понимаю, вы написали регулярку которая делает так:
Оставь мне только русский символ, любого регистра в юникоде. и если найдёшь более одного пробела замени его на один. Но ведь ^ после [ это считается исключающем? Т.е. Не оставь мне русские буквы а наоборот. Почему получается так, что работает по первому сценарию?
Doox911 Отправлено: 17 Июля, 2018 - 08:50:15 • Тема: Почему в режиме $strict in_array не верную кодировку? • Форум: Вопросы новичков

Ответов: 8
Просмотров: 87
Делаю вот такую проверку:
PHP:
скопировать код в буфер обмена
  1.  
  2.     public static function CheckRussianLanguage ( $string ) {
  3.         $alfavit = array (' ','А','а','Б','б','В','в','Г','г','Д','д','Е','е','Ё',
  4.                          'ё','Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м',
  5.                          'Н','н','О','о','П','п','Р','р','С','с','Т','т','У','у','Ф',
  6.                          'ф','Х','х','Ц','ц','Ч','ч','Ш','ш','Щ','щ','Ъ','ъ','Ы','ы',
  7.                          'Ь','ь','Э','э','Ю','ю','Я','я','0','1','2','3','4','5','6','7','8','9');
  8.         $dlinna_str = strlen ( $string );
  9.         $clear_string = '';
  10.         for ( $count = 0; $count<$dlinna_str; $count++ ) {
  11.             var_dump($string[$count]);
  12.            
  13.             $check = in_array ( $string[$count], $alfavit, true );
  14.             if ( $check ) {
  15.                 $clear_string .= $string[$count];
  16.             }
  17.         }
  18.         $clear_string = preg_replace ( "/ {1,}/", " ", $clear_string );
  19.         return $clear_string;
  20.     }
  21.  


При не строгом режиме пропускает всё. В чём может быть причина?
Вывожу var_dump

string(1) "�"
string(1) "�"
string(1) "�"
string(1) "�"
string(1) "�"
string(1) "�"
string(0) ""
Doox911 Отправлено: 17 Июля, 2018 - 07:11:14 • Тема: Как лучше производить валидацию? • Форум: Вопросы новичков

Ответов: 9
Просмотров: 76
andrewkard пишет:
Любым удобным для Вас способом. Нужно сделать на клиенте и на сервере. На сервере обязательно.

Это то понятно) Просто у меня друг хранит в массиве весь алфавит и разрешенные символы и входящую строку сравнивает. Регулярка требовательна к ресурсам.
Doox911 Отправлено: 16 Июля, 2018 - 17:51:28 • Тема: Как лучше производить валидацию? • Форум: Вопросы новичков

Ответов: 9
Просмотров: 76
Добрый вечер. Сегодня созрел интересный вопрос. А как лучше проводить валидацию input?
Например мне необходимо чтобы остались только русские буквы и всё. Варианты:
1. Регуляркой;
2. По символьно (массив символов).
Что из этого быстрее и качественнее? Может есть ещё способ менее затратный по ресурсам?
Поделитесь опытом.

Страниц (10): [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