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


Sparky
$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

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

SBTesla
<?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

Отлично!

ArtemijeKA
$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

Отлично!

demyanovpaul@yandex.ru

С помощью регулярных выражений выдерните из этой переменной 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

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

Bogdan
<?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

Отлично!

vampireoflight2509@gmail.com

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

ivashkevich

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

Galay
<?php

$url = '/post/892';

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

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

$controller = $matches[1];

$id = $matches[2];

?>
ivashkevich

Отлично

Dram
<?php

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

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

ivashkevich

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

Dram

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

<?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

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

Dram

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

<?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>';
rlytrue@gmail.com

Привет.

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

ivashkevich

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

polvanovv

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

$re = '~(.+\d+)\s(.+)~';
polvanovv
$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

Отлично!

Moskva
<?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

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

  1. Имя контроллера не всегда 4 символа
  2. id не всегда 3 цифры
Iliusha99
$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

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

Iliusha99

Ок, понял.

artemship
<?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

Супер!

Pro100Bah
// 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

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

vtolstov

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

ivashkevich

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

XXX
$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

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

ivashkevich

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

XXX
$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

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

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

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

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

Отлично

prinzplanloser0514@gmail.com
<?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

Супер!

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Логические задачи с собеседований