Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярные выражения. Тренировки teddy [3]

 PHP.SU

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


 Страниц (3): « 1 2 [3]   

> Без описания
teddy
Отправлено: 19 Августа, 2013 - 14:38:08
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Саныч
Спасибо! я так понимаю | это как OR ? Т.е одно или другое?

Саныч пишет:
Не пойдет. Это значит: любой символ, кроме символов qwerty.

А как тогда можно определить что пришло 3 символа подряд?

Хм
(Добавление)
Я тут всем надоем
 
 Top
Саныч
Отправлено: 19 Августа, 2013 - 14:44:38
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Panoptik пишет:
или же нужно проверять и такие как sdfg || werty || bcdef ?
Проверять нужно все. Видите любую последовательность на клавиатуре больше 2 символов, либо тоже самое, но в алфавите. Вот их не должно быть. Вот как этот момент организовать я пока не придумал, разве что тупо перечислением через или, но как-то многовато получится Улыбка
(Добавление)
teddy пишет:
Спасибо! я так понимаю | это как OR ? Т.е одно или другое?
Да.
(Добавление)
teddy пишет:
Я тут всем надоем
Да не, нормально. Я и сам не против лишний раз в регулярках покопаться. Нравятся они мне почему-то Улыбка

(Отредактировано автором: 19 Августа, 2013 - 14:47:06)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
teddy
Отправлено: 19 Августа, 2013 - 14:54:29
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Саныч
Я просто раньше так особо не вникал в них, но сейчас решил чуть больше обратить внимание т.к иногда нужно бывает и даже необходимо. При формировании ЧПУ например. Есть конечно готовые решения но я думаю, что нужно уметь самому. Хуже не будет. Наоборот думаю логика станет лучше формироваться

Саныч пишет:
Вот как этот момент организовать я пока не придумал

Аналогично )) точнее придумал, но вы забраковали )
 
 Top
Panoptik
Отправлено: 19 Августа, 2013 - 15:18:12
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




получается для проверки последовательности нужно сделать как-то так
PHP:
скопировать код в буфер обмена
  1.  
  2. $sequences = array();
  3. $sequences[] = implode('',range('a','z'));
  4. $sequences[] = 'qwertyuiop';
  5. $sequences[] = 'asdfghjkl';
  6. $sequences[] = 'zxcvbnm';
  7.  
  8. $s = array();
  9. foreach($sequences as $sequence) {
  10.   $len = strlen($sequences);
  11.   for($i = 0; $i < $len - 2; $i++) {
  12.      $s[] = substr($sequence, $i, 3);
  13.   }
  14. }
  15. $reg_exp = implode('|',$s);
  16.  


ну и результат всунуть в регулярку

(Отредактировано автором: 19 Августа, 2013 - 15:26:49)



-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 19 Августа, 2013 - 15:59:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Саныч
В том классе речь никогда не шла о красоте. Речь шла о том, чтобы работало. Практическая ценность - как раз для случаев, когда в основное регулярное выражение нужно добавить условие диапазона какой-либо его части (но не хочется задумываться о том, как создать этот диапазон).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Саныч
Отправлено: 19 Августа, 2013 - 16:00:57
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Panoptik пишет:
ну и результат всунуть в регулярку
Ну только смысл тогда вобще регулрку использовать... Если мы так формируем массив, то сразу в теле и ищем эти кусочки в строке пароля. Кстати, вы забыли про этиже строки, но в реверсе.

Вобщем, я так и не придумал как это сделать в регулярке, кроме тупого перечисления вариантов.
Зато вот наваял класс, для проверки пароля, удовлетворяет всем поставленым условиям, плюс я еще от себя добавил проверку на присутствиие хотя бы одной цифры.
Оформил в виде класса, но можно конечно и в функцию все запихать.
PHP:
скопировать код в буфер обмена
  1. final class ValidPass
  2. {
  3.     private
  4.         $_pass   = '',
  5.         $_errors = array(
  6.             1    =>    'Длина меньше 6 символов',
  7.             2    =>    'Нет ни одной заглавной буквы',
  8.             3    =>    'Нет ни одной прописной буквы',
  9.             4    =>    'Нет ни одной цифры',
  10.             5    =>    'Нет ни одного специального символа',
  11.             6    =>    'Недопустимая последовательность символов'
  12.         ),
  13.         $_error  = 0,
  14.         $_isValid;
  15.    
  16.     public function __construct($pass) {
  17.         if (!is_string($pass)) {
  18.             trigger_error(__CLASS__ . ': Parameter 1 must be string, ' . gettype($pass) . ' given', E_USER_WARNING);
  19.         } else {
  20.             $this->_pass = $pass;
  21.         }
  22.     }
  23.    
  24.     public function isValid() {
  25.         if (is_null($this->_isValid)) {
  26.             $this->_isValid = $this->_validate();
  27.         }
  28.         return $this->_isValid;
  29.     }
  30.    
  31.     public function getError() {
  32.         return $this->_error ? $this->_errors[$this->_error] : '';
  33.     }
  34.    
  35.     private function _validate() {
  36.         $passLen = function_exists('mb_strlen') ? mb_strlen($this->_pass, 'UTF-8') : strlen($this->_pass);
  37.         if ($passLen < 6) {
  38.             $this->_error = 1;
  39.             return false;
  40.         }
  41.        
  42.         $bigLetter = $smallLetter = $integer = $symbol = false;
  43.         foreach (str_split($this->_pass) as $letter) {
  44.             $code = ord($letter);
  45.             $bigLetter = $bigLetter ?: $code > 64 && $code < 91;
  46.             $smallLetter = $smallLetter ?: $code > 96 && $code < 123;
  47.             $integer = $integer ?: $code > 47 && $code < 58;
  48.             $symbol = $symbol ?: ($code > 32 && $code < 48) || ($code > 57 && $code < 65)
  49.                 || ($code > 90 && $code < 97) || ($code > 122 && $code < 127);
  50.         }
  51.         if (!$bigLetter) {
  52.             $this->_error = 2;
  53.             return false;
  54.         }
  55.         if (!$smallLetter) {
  56.             $this->_error = 3;
  57.             return false;
  58.         }
  59.         if (!$integer) {
  60.             $this->_error = 4;
  61.             return false;
  62.         }
  63.         if (!$symbol) {
  64.             $this->_error = 5;
  65.             return false;
  66.         }
  67.        
  68.         $sequences = array('qwertyuiop', 'asdfghjkl', 'zxcvbnm', '1234567890', 'abcdefghijklmnopqrstuvwxyz');
  69.         for ($n = 0, $end = $passLen - 2; $n < $end; $n++) {
  70.             $str = strtolower(substr($this->_pass, $n, 3));
  71.             foreach ($sequences as $seq) {
  72.                 if (strpos($seq, $str) !== false || strpos($seq, strrev($str)) !== false) {
  73.                     $this->_error = 6;
  74.                     return false;
  75.                 }
  76.             }
  77.         }
  78.        
  79.         return true;
  80.     }
  81. }
  82.  
  83. $pass = new ValidPass('P@s$w0rd');
  84. var_dump($pass->isValid(), $pass->getError());

(Добавление)
EuGen пишет:
В том классе речь никогда не шла о красоте. Речь шла о том, чтобы работало.
Так я ж не спорю, все работает. Просто руками я напишу туже регулярку на много меньше и красивее. А вот код написать, который бы генерировал такой же результат как я руками пишу, у меня увы не получилось...

(Отредактировано автором: 19 Августа, 2013 - 16:04:42)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
EuGen Администратор
Отправлено: 19 Августа, 2013 - 16:07:16
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Насчёт последовательностей - подсказка - если строка не содержит "qwe", то она не содержит и "qwer" и "qwert" и т.п.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
teddy
Отправлено: 19 Августа, 2013 - 17:19:21
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DelphinPRO
Сделал как смог, чую это говнорешение )) но для начала - простительно ))
PHP:
скопировать код в буфер обмена
  1. $tag = "<span id='mySpan'>TheSpan</span>";
  2. preg_match("/([^<][a-z]+)\s([a-z=']+).([a-z]+)/i", $tag, $matches);
  3. echo "<pre>";
  4. print_r($matches);
  5. echo "</pre>";
  6.  

Output:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Array
  3. (
  4.     [0] => span id='mySpan'>TheSpan
  5.     [1] => span
  6.     [2] => id='mySpan'
  7.     [3] => TheSpan
  8. )
  9.  

(Отредактировано автором: 19 Августа, 2013 - 17:30:56)

 
 Top
Саныч
Отправлено: 19 Августа, 2013 - 17:33:11
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




PHP:
скопировать код в буфер обмена
  1. $tag = 'какой-то текст <span id="blbla" class="span">потом идет спан, a внутри еще и <a href="inedx.php">ссылка</a> есть</span> ну и дальше опять текст';
  2. preg_match("/([^<][a-z]+)\s([a-z=']+)(.*\w+)/i", $tag, $matches);
  3.  
  4. echo "<pre>";
  5. print_r($matches);
  6. echo "</pre>";

CODE (htmlphp):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [0] => span id="blbla" class="span">потом идет спан, a внутри еще и <a href="inedx.php">ссылка</a> есть</span> ну и дальше опять текс
  4.     [1] => span
  5.     [2] => id=
  6.     [3] => "blbla" class="span">потом идет спан, a внутри еще и <a href="inedx.php">ссылка</a> есть</span> ну и дальше опять текс
  7. )
Чет не то Улыбка

(Отредактировано автором: 19 Августа, 2013 - 17:33:59)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
teddy
Отправлено: 19 Августа, 2013 - 17:41:50
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Саныч
Так задача была по минимуму без вложенных тегов Улыбка

Я устал позориться Хм Язычок
 
 Top
soffrick
Отправлено: 19 Августа, 2013 - 18:10:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 379
Дата рег-ции: Май 2012  
Откуда: Россия, Москва


Помог: 17 раз(а)




DelphinPRO пишет:
Задача - спарсить стандартный html-тег (для упрощения - только парный). Получить на выходе имя тега, массив атрибутов и их значений (учесть что атрибут может не иметь значения) и текстовое содежимое самого тега. Вложенных тегов нет.
Практическая ценность стремится к нулю, но для обучения пойдет.

пока удалось такое:
HTML пишет:
нет поддержки нескольких атрибутов
Спойлер (Отобразить)


или же так
html пишет:
Спойлер (Отобразить)

истина уже близко Улыбка
Цитата:
массив атрибутов и их значений

ну эт можно наверно и без регулярки привести к массиву
CODE (php):
скопировать код в буфер обмена
  1. onclick="alert('PHP <3')" style="color:red" id="exit"

(Добавление)
teddy пишет:
устал позориться

дык ты основ не знаешь, а темы плодишь чаще чем запросы к гуглу
(Добавление)
и чё ты мне в личку бред пишешь, сам же говорил не замечаем друг друга, а тут будто тебе общения не хватает чтоли

(Отредактировано автором: 19 Августа, 2013 - 18:18:22)



-----
Правильный вопрос - уже половина правильного ответа!

p.s. индусы повсюду, будьте осторожны!
 
 Top
teddy
Отправлено: 19 Августа, 2013 - 19:23:45
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




soffrick
Что в твоем понимании есть основы? Сколько тем создавать - решать мне. Форум этого не запрещает. Более того, для этого он и создан.

Во вторых если регулярки это основы и ты я так полагаю с ними хорошо знаком, реши задачу про пароли от EuGen.

Любишь болтать лишнее
 
 Top
caballero
Отправлено: 19 Августа, 2013 - 20:26:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
будто тебе общения не хватает чтоли

каникулы
уроки учить не надо


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
teddy
Отправлено: 21 Августа, 2013 - 13:19:53
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Вообщем в итоге ничего не получается сделать с задачей с паролями. Вернее получается, как например показал Саныч(разбить выражение на элементы массива и если они не пустые то все ОК) - но обойтись одним регулярным выражением ну в упор не выходит... Недовольство, огорчение
(Добавление)
Саныч
Свой пример я до вашего постинга изменял..) без вложенных тегов как и было задание - все работает ) (но в этом посте тоже подправил и вот итоговый результат)
PHP:
скопировать код в буфер обмена
  1.  
  2. $tag = "hello <span id='mySpan' class='mySpan'>TheSpan</span> world";
  3. preg_match("/([^<][a-z]+)\s([a-z='\s\"]+).([a-z]+)/i", $tag, $matches);
  4. echo "<pre>";
  5. print_r($matches);
  6. echo "</pre>";
  7.  

output:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => span id='mySpan' class='mySpan'>TheSpan
  4.     [1] => span
  5.     [2] => id='mySpan' class='mySpan'
  6.     [3] => TheSpan
  7. )
  8.  

(Отредактировано автором: 21 Августа, 2013 - 14:05:35)

 
 Top
Страниц (3): « 1 2 [3]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB