Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
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

Отлично!

artemjeka 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

Отлично!

stokato 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

Отлично!

[email protected] 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

Отлично

[email protected] 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, если он один?
andreskrip 23.01.2020 в 16:57

Спасибо за урок, а обязательно делать буквенное ограничение для контроллера? id логично что будет в числовом представлении, а контроллеры именуются только буквами?

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

var_dump($controller, $id);
ivashkevich 24.01.2020 в 08:29

Как захотите, так и будут именоваться) Задание выполнено отлично.

OneMoreTime 20.02.2020 в 17:42
<?php
$pattern = '/\/(?P<controller>\w+)\/(?P<id>\d+)/';
$url = '/post/892';

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

$controller = $matches['controller'];
$id = $matches['id'];
ivashkevich 21.02.2020 в 06:30

Контроллер и id перепутаны местами. Куда спешим?)

OneMoreTime 21.02.2020 в 10:48

спасибо, исправил.

Alexann 28.02.2020 в 18:27
<?php
$url='/post/892';
$patt='/\/([a-zA-Z]+)\/([0-9]+)/';
preg_match($patt,$url,$matches);
$controller=$matches[1];
$id=$matches[2];
ivashkevich 29.02.2020 в 11:31

Отлично

serezha-kuznetsov 19.03.2020 в 11:58
<?php 
    $url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $url = explode('?', $url);
    $url = $url[0];

    $reg = "/\/(?P<controller>(post|post\.php))\/(?P<id>[0-9]*)$/m";

        preg_match($reg, $url, $match);    

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

        echo '<br>';
        echo "Вы находитесь на странице - $controller вам будет показана статья с номером - $id";
?>
ivashkevich 19.03.2020 в 16:09
$reg = "/\/(?P<controller>(post|post\.php))\/(?P<id>[0-9]*)$/m";

Для чего всё это? Дан был обычный роут, его надо было распарсить. Для чего обработка post.php? Почему id может быть пустым?

serezha-kuznetsov 06.04.2020 в 20:47
$reg = "/\/(?P<controller>post)\/(?P<id>[0-9]+)$/m";
ivashkevich 07.04.2020 в 09:24

зачем .php опять?

[email protected] 11.04.2020 в 20:19
$regularExp = '/\/(?P<controller>.+)\/(?P<id>[0-9]+)/';
  $url = '/post/892';
  preg_match($regularExp, $url, $matches);
  var_dump($matches);
  $controller = $matches['controller'];
  $id = $matches['id'];
ivashkevich 11.04.2020 в 21:43

Супер! Всё как надо

[email protected] 19.04.2020 в 22:25
$url = '/post/892';

$pattern = '/\/(?P<controller>\w+)\/(?P<id>\d+)/';

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

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

echo $controller . $id;
ivashkevich 20.04.2020 в 04:45

Отлично!

Fill 24.04.2020 в 20:21
<?php

$pattern = '~\/(?P<controller>post)\/(?P<id>[0-9]+)~';
$string = '/post/892';

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

if (!empty($matches)) {
  $controller = $matches['controller'];
  $id = $matches['id'];
}
ivashkevich 24.04.2020 в 20:28

Отлично!

studentDev 29.04.2020 в 09:02
<?php
    $url = '/post/896';
    preg_match_all('~.(?P<post>[a-zA-Z]+)/(?P<id>[0-9]+)~', $url, $matches);

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

?

Dmitry.Dudin 29.04.2020 в 12:08

1) Нужно всегда делать проверку $matches на пустоту. Если будет использоваться в роутинге, и введут неправильный адрес, то выдаст большой блок ошибок.

2) Вместо точки, посередине регулярки, лучше поставить слеш, так как это всё таки урл, и может появиться запись типа: "post-php" и всё собьётся

3) В таких случаях лучше сразу использовать preg_match()

А вообще да, в конкретном случае работать будет

studentDev 29.04.2020 в 15:31

Угу, исправлю. По началу я ставил '/' и из за этого происходил сбой так как ограничители стоят '/'. Недавно после ДЗ узнал что можно использовать в качестве ограничителей любые символы. Спасибо за совет)

Dmitry.Dudin 29.04.2020 в 11:59
<?php
$url = '/post/892';
try {
    preg_match('*^\/(.+)\/([0-9]+)$*', $url, $matches);
    if ($matches != null) {
        $controller = $matches[1];
        $id = $matches[2];
    } else {
        throw new Exception('Страница не найдена');
    }
} catch (Exception $e) {
    echo '<h1>' . $e->getMessage() . '</h1>';
}

Мне кажется, надо регулярки раньше учить, а не когда весь курс прошёл) Тем более, так доступно написано, что можно просто продублировать в курс для начинающих

ivashkevich 29.04.2020 в 20:17

Их боятся, они страшные на первый взгляд)

[email protected] 30.04.2020 в 21:15

они и впрямь страшные бяки :<
было сложновато это запомнить :<

[email protected] 30.04.2020 в 21:10
<?php

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

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

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

Отлично!

titelivus 04.05.2020 в 10:22
<?php

$url = '/post/892';

$pattern = '/\/(?P<article>post)\/(?P<articleId>[0-9]+)/';
preg_match($pattern, $url, $matches);

$controller = $matches['article'];
$id = $matches['articleId'];
echo $controller;
echo '<br>';
echo $id;
ivashkevich 06.05.2020 в 13:30

Норм. Имена только не самые подходящие. Особенно article

[email protected] 04.07.2020 в 20:13
<?php
$pattern = '/\/(.+)\/([0-9]+)/';
$url = '/post/892';
preg_match($pattern, $url, $choose);
$controller = $choose[1];
$id = $choose[2];
ivashkevich 06.07.2020 в 07:03

Норм!

[email protected] 08.09.2020 в 02:45

Один вопрос, а как сделать, чтобы код брал только первую часть адреса, если к примеру адрес такой post/title/892 ?
Выключал жадность, тогда в id идёт только одна цифра.

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

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

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

var_dump($id, $controller);
ivashkevich 08.09.2020 в 18:38

Добавить в паттерн символ конца строки - $ и включить жадность
Ну и в паттерне должна быть часть где тайтл

pixel 23.11.2020 в 11:39
<?php
    $url = '/post/892';
    $pattern = '/\/(?P<controller>post)\/(?P<id>[0-9]+)/';
    preg_match($pattern, $url, $matches);
    var_dump($matches);
ivashkevich 23.11.2020 в 17:44

Отлично

pixel 13.02.2021 в 15:50
^\/(?P<controller>.+)\/(?P<id>\d+)$
ivashkevich 14.02.2021 в 15:20

Отлично!

Vladimir96 08.04.2021 в 00:09

Спасибо за уроки.
ДЗ

$reg = '/\/([a-z]+)\/([0-9]+)/';
$url = '/post/892';

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

$controller = $matches[1];
$id = $matches[2];
ivashkevich 08.04.2021 в 19:47

Отлично

Sergey503 21.05.2021 в 16:57
$pattern = '/\/(?P<controller>[a-z]+)\/(?P<id>[0-9]+)/m';
$url = '/post/892';

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

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

var_dump($matches);

или так

$pattern = '/\/([a-z]+)\/([0-9]+)/m';
$url = '/post/892';

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

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

var_dump($matches);
ivashkevich 23.05.2021 в 00:04

Отлично

serega19860511 01.06.2021 в 21:31
$url = '/posT/892';
$pattern = '#^/([a-z-A-Z]+)/([0-9]+)$#';
preg_match($pattern, $url, $matches);
var_dump($matches);
$cont = $matches[1];
$id = $matches[2];
echo $cont . ' ' . $id;
ivashkevich 04.06.2021 в 21:03

Супер

[email protected] 23.10.2021 в 11:52

Всем привет, подскажите а как обрабатывать регулярками следующую ситуацию
у меня есть массив маршрутов, я его перебираю в цикле на предмет совпадения с ```
$_SERVER['REQUEST_URI']

как написать регулярку, чтобы если в урл есть GET параметры, они игнорировались поиском?
Например, урл blog/animals я проверяю так 

'blog/([a-z0-9_-]+)*$' => 'blog/category',


вызывая тем самым метод category контроллера blog, мне нужно что-бы урл вида
blog/animals/?vid=dog&color=black так же обрабатывался, как и урл blog/animals
Заранее спасибо!
ivashkevich 24.10.2021 в 09:18
~blog/([a-z0-9_-]+).*$~
Логические задачи с собеседований