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
Форумы портала PHP.SU :: Версия для печати :: Регулярные выражения. Тренировки teddy [3]
Форумы портала PHP.SU » PHP » Регулярные выражения » Регулярные выражения. Тренировки teddy

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

31. teddy - 19 Августа, 2013 - 14:38:08 - перейти к сообщению
Саныч
Спасибо! я так понимаю | это как OR ? Т.е одно или другое?

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

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

Хм
(Добавление)
Я тут всем надоем
32. Саныч - 19 Августа, 2013 - 14:44:38 - перейти к сообщению
Panoptik пишет:
или же нужно проверять и такие как sdfg || werty || bcdef ?
Проверять нужно все. Видите любую последовательность на клавиатуре больше 2 символов, либо тоже самое, но в алфавите. Вот их не должно быть. Вот как этот момент организовать я пока не придумал, разве что тупо перечислением через или, но как-то многовато получится Улыбка
(Добавление)
teddy пишет:
Спасибо! я так понимаю | это как OR ? Т.е одно или другое?
Да.
(Добавление)
teddy пишет:
Я тут всем надоем
Да не, нормально. Я и сам не против лишний раз в регулярках покопаться. Нравятся они мне почему-то Улыбка
33. teddy - 19 Августа, 2013 - 14:54:29 - перейти к сообщению
Саныч
Я просто раньше так особо не вникал в них, но сейчас решил чуть больше обратить внимание т.к иногда нужно бывает и даже необходимо. При формировании ЧПУ например. Есть конечно готовые решения но я думаю, что нужно уметь самому. Хуже не будет. Наоборот думаю логика станет лучше формироваться

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

Аналогично )) точнее придумал, но вы забраковали )
34. Panoptik - 19 Августа, 2013 - 15:18:12 - перейти к сообщению
получается для проверки последовательности нужно сделать как-то так
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.  


ну и результат всунуть в регулярку
35. EuGen - 19 Августа, 2013 - 15:59:24 - перейти к сообщению
Саныч
В том классе речь никогда не шла о красоте. Речь шла о том, чтобы работало. Практическая ценность - как раз для случаев, когда в основное регулярное выражение нужно добавить условие диапазона какой-либо его части (но не хочется задумываться о том, как создать этот диапазон).
36. Саныч - 19 Августа, 2013 - 16:00:57 - перейти к сообщению
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 пишет:
В том классе речь никогда не шла о красоте. Речь шла о том, чтобы работало.
Так я ж не спорю, все работает. Просто руками я напишу туже регулярку на много меньше и красивее. А вот код написать, который бы генерировал такой же результат как я руками пишу, у меня увы не получилось...
37. EuGen - 19 Августа, 2013 - 16:07:16 - перейти к сообщению
Насчёт последовательностей - подсказка - если строка не содержит "qwe", то она не содержит и "qwer" и "qwert" и т.п.
38. teddy - 19 Августа, 2013 - 17:19:21 - перейти к сообщению
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.  
39. Саныч - 19 Августа, 2013 - 17:33:11 - перейти к сообщению
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. )
Чет не то Улыбка
40. teddy - 19 Августа, 2013 - 17:41:50 - перейти к сообщению
Саныч
Так задача была по минимуму без вложенных тегов Улыбка

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

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


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

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

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

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

дык ты основ не знаешь, а темы плодишь чаще чем запросы к гуглу
(Добавление)
и чё ты мне в личку бред пишешь, сам же говорил не замечаем друг друга, а тут будто тебе общения не хватает чтоли
42. teddy - 19 Августа, 2013 - 19:23:45 - перейти к сообщению
soffrick
Что в твоем понимании есть основы? Сколько тем создавать - решать мне. Форум этого не запрещает. Более того, для этого он и создан.

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

Любишь болтать лишнее
43. caballero - 19 Августа, 2013 - 20:26:23 - перейти к сообщению
Цитата:
будто тебе общения не хватает чтоли

каникулы
уроки учить не надо
44. teddy - 21 Августа, 2013 - 13:19:53 - перейти к сообщению
Вообщем в итоге ничего не получается сделать с задачей с паролями. Вернее получается, как например показал Саныч(разбить выражение на элементы массива и если они не пустые то все ОК) - но обойтись одним регулярным выражением ну в упор не выходит... Недовольство, огорчение
(Добавление)
Саныч
Свой пример я до вашего постинга изменял..) без вложенных тегов как и было задание - все работает ) (но в этом посте тоже подправил и вот итоговый результат)
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.  

 

Powered by ExBB FM 1.0 RC1