Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сохраняющие круглые скобки в регулярных выражениях


Автор: XAKEPEHOK 14.10.2011, 09:52
Добрый день!
Ребят, подскажите пожалуйста, до меня не доходит...
Изучаю регулярные выражения по http://phpclub.ru/detail/article/regexp_1, там есть раздел про сохраняющие круглые скобки
Цитата

Если мы просто хотим проверить строку на соответствие условию совпадения, то условие поиска будет вот таким: [a-z]{5}[1-8]{4} но нам надо запомнить цифры, поэтому добавляем инструкцию запоминания: [a-z]{5}([1-8]{4})

Как видите, то, что надо запомнить, выделено круглыми скобками. Внутри функции, которая будет выполнять операцию со строкой при помощи вышеприведенного условия, совпадение будет запоминаться в специальных переменных, в PHP к ней можно обращаться через \1 в Perl - $1. В одном условии поиска может быть несколько инструкций запоминания: ([a-z]{5})([1-8]{4}) - проверит строку на совпадение с условием, в случае удачного совпадения, запомнит пять букв в \1 ($1), четыре цифры в \2 ($2). Если обратиться к переменной \0, то окажется, что в ней хранится вся совпавшая строка, которая была описана условием.


Так вот я не пойму, каким образом обращаться к этим переменным \1, \2 ....
Можете привести пример кода?

Автор: baldina 14.10.2011, 09:55
Цитата(XAKEPEHOK @  14.10.2011,  09:52 Найти цитируемый пост)
 каким образом обращаться к этим переменным

это касается замены.
http://php.net/manual/ru/function.preg-replace.php

Добавлено через 5 минут и 59 секунд
конечно, это упрощенно и не совсем верно. 
на самом деле результатом работы preg_match являются в т.ч. строки-совпадения. вот они то и зависят от группировки (скобок). они же применяются для замены.

наглядно увидеть как это работает можно http://gskinner.com/RegExr/.

Автор: $дмитрий 14.10.2011, 12:43
Цитата

Можете привести пример кода? 

Код

echo preg_replace("#p(h)p#", "\\1tml", "php");


Добавлено через 14 минут и 1 секунду
А можно обращаться в самом шаблоне
Код

echo preg_replace("#(p)(h)\\1#", "$2tml", "php");

Автор: XAKEPEHOK 14.10.2011, 18:55
baldina, спасибо!

$дмитрий, большое спасибо! Разобрался.

Автор: XAKEPEHOK 15.10.2011, 14:07
Не буду создавать отдельный топик, спрошу здесь. Уже голову сломал, не пойму что не так.

Код

$html='<h1 id="title"><b class="indigo">Пользователь</b>Иванов Иван</h1>';
preg_match('/(?<=<\/b>)[.]*(?=<\/h1>)/i', $html, $matches);
print_r($matches); 


Возвращает вместо имени пользователя пустой массив Array ( ). Что я делаю не так?

Автор: $дмитрий 15.10.2011, 14:27
Код

#</b>(.+?)</h1>#i

Автор: XAKEPEHOK 15.10.2011, 14:34
$дмитрий, спасибо, работает. Но это все же другой вариант. Почему не работают ретроспективная и опережающая проверки? Я делал по статье http://phpclub.ru/detail/article/regexp_2. В чем у меня была ошибка?

Автор: Evghenusi 15.10.2011, 14:37
Цитата(XAKEPEHOK @  15.10.2011,  14:07 Найти цитируемый пост)
Что я делаю не так?

точку в квадратные скобки брать не надо
Код
preg_match('/(?<=<\/b>).*(?=<\/h1>)/i', $html, $matches);

Автор: XAKEPEHOK 15.10.2011, 14:47
Evghenusi,  smile спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)