Чат Telegram
Группа ВКонтакте
Новый комментарий


Sparkqy 01.09.2018 в 12:22
$re = '/\/(?P<controller>[a-z]+)\/(?<id>[0-9]+)/m';
$str = '/post/892';

preg_match($re, $str, $matches);

$controller = $matches['controller'];
$id = $matches['id'];

Сначала удивило, что созданный массив $matches имеет "копии" найденных элементов (ассоциативный, индексный) при использовании масок:)
Какие ещё проверки можно использовать для данного кода?

ivashkevich 01.09.2018 в 13:44

При использовании масок стоит всегда использовать ключи-имена, соответствующие маскам.

SBTesla 11.10.2018 в 11:25
<?php
$pre = '/\/(?P<controller>[a-z]+)\/(?<id>[0-9]+)/m';
$url = '/post/892';

preg_match($pre, $url, $matches);

$controller = $matches['controller'];
$id = $matches['id'];

var_dump($controller, $id);
ivashkevich 12.10.2018 в 08:46

Отлично!

ArtemijeKA 16.10.2018 в 17:03
$preg = '/\/(?P<controller>[a-z]{1,99})\/(?P<id>[0-9]{1,99})/';
$url = '/post/892';
preg_match($preg, $url, $match);

$controller = $match['controller'];
$id = $match['id'];
var_dump($controller, $id);
ivashkevich 17.10.2018 в 00:39

Отлично!

demyanovpaul@yandex.ru 07.11.2018 в 10:17

С помощью регулярных выражений выдерните из этой переменной 2 значения и положите их в переменные:
$controller - сюда положите строку 'post'
$id - сюда положите число 892

$prepare = '\/(?P<controller>.+)\/(?P<id>[0-9]+)'
$str = '/post/892';

preg_match($prepare, $str, $matches);

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 08.11.2018 в 10:36

Всё правильно)

Bogdan 07.01.2019 в 21:43
<?php
$re = '/(?P<controller>[a-zA-Z]{4})\/(?P<id>[0-9]{3})/';
$str = '\'/post/892\';';

preg_match($re, $str, $matches);

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 07.01.2019 в 22:38

Отлично!

vampireoflight2509@gmail.com 23.01.2019 в 12:17

.(?<controller>\b\w+\b).(?<id>\d{3})

ivashkevich 23.01.2019 в 21:53

На конкретном примере работает, но если число цифр в id поста изменится, то поломается.

Galay 13.02.2019 в 15:20
<?php

$url = '/post/892';

$pattern = '~/(post)/([0-9]+)~';

preg_match($pattern, $url, $matches);

$controller = $matches[1];

$id = $matches[2];

?>
ivashkevich 13.02.2019 в 15:28

Отлично

Dram 12.05.2019 в 14:25
<?php

$url = '/post/892';
preg_match_all('/[a-zA-Z]+|[0-9]+/', $url, $matches);
var_dump($matches);

P.S. посмотрел комменты выше, мне кажется мое решение самое правильное, лаконичное и универсальное, я прав?

ivashkevich 12.05.2019 в 15:09

Нет. У вас здесь вообще нет ни контроллера ни id в результате.

Dram 12.05.2019 в 15:23

Прошу прощения, так увлекся регулярками (никогда их не понимал, а тут врубился!!!) и на радостях невнимательно прочитал домашку :))

<?php

$url = '/post/892';
preg_match_all('/[a-zA-Z]+|[0-9]+/', $url, $matches);
$controller = $matches[0][0];
$id = $matches[0][1];
echo $controller .'<br>';
echo $id;
ivashkevich 12.05.2019 в 23:02

Не то. Под вашу регулярку попадает /post/kokok/892 и на выходе имеем 3 совпадения.

Dram 13.05.2019 в 07:37

В условиях домашки нет предположений, что урл возможен другой. Есть четкое условие, которое я выполнил.
И тем не менее:

<?php
$url = '/post/892';
preg_match_all('~/(post)+/([0-9]+)~', $url, $matches);

if(isset($matches)){
    $controller = $matches[1][0];
}
if(isset($matches)){
$id = $matches[2][0];
}
echo $controller .'<br>';
echo $id .'<br>';
murr31 10.06.2019 в 16:31

Привет.

Не подскажешь, как взять от строки только символы до букв, а потом наоборот
Например: 04.12-15 абракадабра2
Нужно получить: 04.12-15 и абракадабра2

ivashkevich 11.06.2019 в 02:16

Урок не помог?

polvanovv 27.06.2019 в 09:22

Такое выражение может помочь в данном случае:

$re = '~(.+\d+)\s(.+)~';
polvanovv 27.06.2019 в 09:15
$re = '~(?P<controller>post)/(?P<id>\d+)~';
$str = 'post/892';

preg_match_all($re, $str, $matches,);

$controller = $matches['controller'];
$id = $matches['id'];

var_dump($controller, $id);
ivashkevich 27.06.2019 в 19:11

Отлично!

Moskva 08.07.2019 в 11:59
<?php

$re = '/\/(?P<controller>[a-z]{4})\/(?P<id>[0-9]{3})/m';
$url = '/post/892';

preg_match($re, $url, $matches, PREG_OFFSET_CAPTURE, 0);

// Print the entire match result
var_dump($matches);

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 08.07.2019 в 20:55

В целом ок. Но:

  1. Имя контроллера не всегда 4 символа
  2. id не всегда 3 цифры
Iliusha99 19.07.2019 в 20:17
$url = '/post/892';
$pattern='/\/(?P<post_title>[a-zA-Z]+)\/(?P<post_id>[0-9]+)/';

preg_match($pattern, $url, $results);

$controller = $results['post_title'];
$id = $results['post_id'];

echo $controller.'<br>';
echo $id;
ivashkevich 20.07.2019 в 14:40

Хорошо. Только это скорее не post_title, а controller_name

Iliusha99 20.07.2019 в 14:50

Ок, понял.

artemship 30.07.2019 в 17:26
<?php

$pattern = '/\/(?P<controller>[A-Z,a-z]+)\/(?P<id>[0-9]+)/';
$url = '/post/892';

preg_match($pattern, $url, $matches);

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 30.07.2019 в 18:26

Супер!

Pro100Bah 05.09.2019 в 14:37
// Homework 13.1
$pattern = '/\/(?P<controller>[a-z]+)\/(?P<id>[0-9]+)/';
$str = '/post/892';

preg_match($pattern, $str, $matches);

$controller = $matches['controller'];
$id = $matches['id'];
var_dump($controller, $id);
echo 'Статья: '. $controller . '<br>';
echo 'Идентификатор этой статьи: ' . $id;

Ох долго я этот урок проходил. Дошло вроде с раза 3, несколько раз перечитывал. НО вот на этот ресурсе https://regex101.com проверял свой код мне ставит другой

$re = '/\/(?P<controller>[a-z]+)\/(?P<id>[0-9]+)/m';
$str = '\'/post/892\'';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

Хотя тоже рабочий, но вот этот параметр отвечает за порядок сортировки как я понял (PREG_SET_ORDER), а вот 0 это что такое? Поправьте, если я не прав или не туда лезу.

ivashkevich 05.09.2019 в 19:46

Лезьте куда хотите) Это прекрасно, что вы выходите за рамки уроков. На языке PHP можно делать совершенно разные решения одной и той же задачи. Не удивляйтесь тому, что другой код делает в результате то же самое. На счёт аргумента - не знаю, почитайте документацию по функции.

vtolstov 20.09.2019 в 09:52

Скопировал вашу строку "Меняем автора статьи 123 c "Иван" на "Пётр" и начал с ней пытаться что-нибудь сделать. Никак не мог понять, почему ваши выражения работают, а мои нет. Оказалось что у вас буква "с" - английская ))))

ivashkevich 21.09.2019 в 07:21

:D вот это пасхалочка

XXX 29.09.2019 в 12:02
$re = '/к.ш/';     // '.' - любой символ
$str = 'кукушки не кушают шоколадки';

preg_match_all($re, $str, $matches); 
var_dump($matches);

// Выводит пустой масив. Если $re = '/к./' - выводит все варианты только в виде к и знак вопроса.
// Это так нужно? Или я что-то не правильное ввожу?

array (size=1)
0 =>
array (size=0)
empty
array (size=1)
0 =>
array (size=6)
0 => string 'к�' (length=3)
1 => string 'к�' (length=3)
2 => string 'к�' (length=3)
3 => string 'к�' (length=3)
4 => string 'к�' (length=3)
5 => string 'к�' (length=3)

XXX 29.09.2019 в 12:10

С латынью работает все отлично. Вопрос как искать кирилицу.

ivashkevich 29.09.2019 в 12:25

И правильно, что пустой. В строке нет таких совпадений. Про регулярки и utf-8 тут

XXX 29.09.2019 в 12:56
$re = '/^\+7[0-9]{10}$/m'; //  m - многострочный режим
$str = '+78888888888
+76666666666
+7839249239445';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

Должно вывести два номера, но опять же масив пустой. Хотя на сайте, где составляют регулярки показывает совпадение по 2 номерам.

XXX 29.09.2019 в 13:02

Спасибо) Нужно было всего лишь добавить модификатор u

XXX 29.09.2019 в 13:42
$pattern = '/\/(?P<controller>.+)\/(?P<id>[0-9]+)/';
$url = '/post/892';

preg_match($pattern, $url, $matches);

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 29.09.2019 в 13:44

Отлично

prinzplanloser0514@gmail.com 05.10.2019 в 15:06
<?php

$re = '/\'\/(?P<controller>[a-z]+)\/(?<id>[0-9]+)\'/m';
$str = '\'/post/892\' ';

preg_match_all($re, $str, $matches);

var_dump($matches);
$controller = $matches['controller'];
$id = $matches['id'];

var_dump($controller);
var_dump($id);
ivashkevich 05.10.2019 в 15:46

Супер!

VpsK 04.12.2019 в 14:04

А я видимо вообще слишком упростил )). Конечно же если будет что то другое стоять то не сработает, но вроде как условие ДЗ выполнил.

<?php
$url = '/post/892';
$patern = '~(post)/(.+)~';
preg_match ($patern,$url,$matches);

unset($matches[0]);//можно опустить
$controllers = $matches[1];
$id = $matches[2];

echo $controllers . '<br>';
echo $id. '<br>';
ivashkevich 05.12.2019 в 14:50
  1. Да, слишком упростили. В ID как минимум нужно ожидать число.
  2. Почему controllers, если он один?
Логические задачи с собеседований