powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PCRE) Странный эффект с группирующими скобками
10 сообщений из 10, страница 1 из 1
(PCRE) Странный эффект с группирующими скобками
    #33563807
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно распарсить регулярным выражением строки вида
aaaaa<br>bbbbb
aaaaabbbbb
так, чтобы в первый элемент попала либо строка до <br>, если тот присутствует в обрабатываемой строке, либо пустая строка в. Соответственно, во второй элемент нужно занести либо продолжение строки после <br>, либо строку целиком.

Мой вариант:
Код: plaintext
1.
2.
3.
4.
$text = 'aaaaa<br>bbbbb';
$pattern = '~(?:([^<]*)<br>(.*)|()([^<]*))~';
preg_match($pattern, $text, $matches);
var_dump($matches);
для первой строки отрабатывает нормально:
array(3) {
[0]=>
string(14) "aaaaa<br>bbbbb"
[1]=>
string(5) "aaaaa"
[2]=>
string(5) "bbbbb"
}
, а для
$text = 'aaaaabbbbb';
получается что-то странное:
array(5) {
[0]=>
string(10) "aaaaabbbbb"
[1]=>
string(0) ""
[2]=>
string(0) ""
[3]=>
string(0) ""
[4]=>
string(10) "aaaaabbbbb"
}
Т.е., выходит, что отрабатывают обе альтернативы, при том, что первому варианту строка не соответствует?
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33563895
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ап... Есть у кого идеи, что за ботва и как жить дальше?
Вообще, мне это довольно срочно надо...(
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33563992
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну подскажите чего-нибудь?(
Может, я какое-то простое решение упускаю из вида?
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564090
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
php manual
В случае, если после открывающей круглой скобки следует "?:", захват строки не происходит, и текущая подмаска не нумеруется.

Как сделать - сейчас подумаю. Кстати, задача СОВЕРШЕННО не требует применения именно регекспа.


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564098
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Требует, она существенно сложнее, на самом деле...
Это просто локализованный источник странного поведения шаблона.
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564116
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
$pattern = '~(?:([^<]*)<br>|)(.*)~';

Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564142
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, такой вариант подходит.
А нет предположений, как может мой вариант выдавать 4 элемента вместо двух?
Я ли что-то не понял в использовании группирующих скобок или это действительно похоже на баг?
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564145
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не баг, просто ты немного недосмотрел по скобкам. Сравни со своим вариантом - и увидишь.


Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564150
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой нет, к сожалению, такой вариант не совсем подходит.(
Мне необходимо, чтобы и в том, и в другом случае захватывалось два элемента, в случае, если <br> в строке нету, первый элемент должен быть пустая строка, второй -- содержимое строки. Собственно, именно поэтому мой вариант и более сложный. Но работает не как предполагалось.
...
Рейтинг: 0 / 0
(PCRE) Странный эффект с группирующими скобками
    #33564169
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
$text1 = 'aaaaabbbbb';
$text2 = 'aaaaa<br>bbbbb';
$pattern = '~(?:([^<]*)<br>|)(.*)~';
preg_match($pattern, $text1, $matches);
var_dump($matches);
preg_match($pattern, $text2, $matches);
var_dump($matches);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
array(3) {
  [0]=>
  string(10) "aaaaabbbbb"
  [1]=>
  string(0) ""
  [2]=>
  string(10) "aaaaabbbbb"
}
array(3) {
  [0]=>
  string(14) "aaaaa<br>bbbbb"
  [1]=>
  string(5) "aaaaa"
  [2]=>
  string(5) "bbbbb"
}

Может, конечно, я чего не понимаю...

Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PCRE) Странный эффект с группирующими скобками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]