Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с регексом - найти субпаттерн

33K
26 декабря 2007 года
drillman
8 / / 26.12.2007
 
Код:
preg_match_all("/\[hello((?<=:)\d+)?\].*?\[\/hello\]/", "[hello:123]666[/hello]", $match);


это чудо пытается найти "123" после двоеточия в имени тега. но не находит - вообще ничего. ошибка где, подскажите пожалуйста?
244
26 декабря 2007 года
UAS
2.0K / / 19.07.2006
А если проще переписать условие поиска?
 
Код:
\[hello:(\d*)\].*?\[/hello\]
16K
26 декабря 2007 года
WorM
33 / / 11.06.2006
раз пошла такая пьянка в чем разница между .*? и .*
15K
27 декабря 2007 года
hel
78 / / 10.11.2007
UAS:
Правильнее наверное будет:
 
Код:
/\[hello\:(\d*)].*\[\/hello\]/
.
Мне кажется ".*" будет ошибочна, я много раз сталкивался с этой проблемой, приходилось всё-таки перечислять только необходимые символы.

Чёрт, не хочет форум хавать слэши-экраны. Косяк однако.
Во.
251
27 декабря 2007 года
SkyMаn
1.7K / / 31.07.2007
Какая входная строка и что нужно получить?
244
27 декабря 2007 года
UAS
2.0K / / 19.07.2006
hel, а ну да)) забыл \d) да и обратные слэши.. ну короче просто в проге проверил, а закопировал на конечный регэксп, а который промежуточно запихнул в буфер обмена)

Насчет .* и .*? - то последний нужен, чтобы отучать от "жадности" запрос..
Почитай про это на http://phpclub.ru/detail/article/regexp_1
33K
27 декабря 2007 года
drillman
8 / / 26.12.2007
Цитата: UAS
А если проще переписать условие поиска?
 
Код:
\[hello:(\d*)\].*?\[/hello\]



о да - так конечно все прекрасно работает :)
только мне нужно чтобы двоеточие с числом было опциональным - а в таком случае вообще ничего не найдется, если мы опустим ":666" после имени тега.

с .*? - тут уже разобрались :D - и правда это сделано как таблетка от "жадности".

мне надо искать содержимое внутри этого тега, независимо от того, есть у него параметр или нет (если есть параметр, то его тоже сохранить). полный регекс такой:

 
Код:
"/[hello((?<=:)\d+)](.*?[inner](.*?)[\/inner].*?[\/hello]/"


только часть
 
Код:
((?<=:)\d+)
не отрабатывается внутри этой конструкции, а отдельно сама по себе - работает :confused:

я, конечно обошелся более дешевым вариантом - в субпаттерн с параметром тега входит и двоеточие, отрезать его не сложно... только очень любопытно в чем я ошибся.

ps вот строка в которой ищет: "[hello] bla-bla [inner] hey-ho! [/inner] again [/hello]" или такая "[hello:666] satan [inner] HERE! [/inner] hehe [/hello]".

pps по поводу неверности .*? - точно не скажу о 100% валидности, но ничего лишнего пока не ищет :)
15K
27 декабря 2007 года
hel
78 / / 10.11.2007
Цитата: UAS
Насчет .* и .*? - то последний нужен, чтобы отучать от "жадности" запрос..


Немного неправильно.
"*" означает 0 или больше вхождений заданного подвыражения.
"+" означает 1 или больше вхождений заданного подвыражения.
Поэтому знак вопроса в выражении ".*?" считаю не нужным и неправильным.

Автор, попробуй:

 
Код:
/\[hello(\:(\d*))?\].*\[\/hello\]/

По идее должно находить и [hello]ABC[/hello] и [hello:123]ABC[/hello].
33K
27 декабря 2007 года
drillman
8 / / 26.12.2007
hel, вы посетили ссылочку от UAS? :) все таки .*? - очень даже полезная конструкция... вы попробуйте с-style комменты поискать:

/* very very strange situation, isn't it? */ cool->call(); /* no comments */

а на коде, предложенном Вами я и остановился :D. но спать спокойно не могу...
244
27 декабря 2007 года
UAS
2.0K / / 19.07.2006
Цитата: hel

Автор, попробуй:
 
Код:
/\[hello(\:(\d*))?\].*\[\/hello\]/

По идее должно находить и [hello]ABC[/hello] и [hello:123]ABC[/hello].


как раз таки, если не укажежь .*?, то найдет не каждый кусок, а вместе взятый, т.е. между первым [hello] и последним [/hello]

>>Поэтому знак вопроса в выражении ".*?" считаю не нужным и неправильным.
Так что советую пересмотреть своё мнение

15K
28 декабря 2007 года
hel
78 / / 10.11.2007
Всё, понял. То-то у меня были раньше с подобным выражением косяки подобного рода. :)
251
28 декабря 2007 года
SkyMаn
1.7K / / 31.07.2007
[COLOR=#000000]а какое кол-во вложенных эллементов может быть?[/COLOR]
251
28 декабря 2007 года
SkyMаn
1.7K / / 31.07.2007
Если это должно быть аппликабельно только к вышеприведенному образцу, то
 
Код:
\[[a-z]+[:0-9]*]([^[]*)[\[a-z]*([^[]*)\[[/a-z]*]([^[]*)\[[/a-z]*]

В противном случае - надо будет реализвать цикл.
PS. Да, забыл длбавить антижадность *? и регистронезависимость i
33K
28 декабря 2007 года
drillman
8 / / 26.12.2007
всем спасибо за время и внимание - извините что неясно выразил суть проблемы, раз столько много вопросов возникло по её сути)

меня беспокоила лишь часть выражения - касательно имени первого тега после которого может следовать или не следовать число с двоеточием. поэтому я предоставил регекс с акцентом на этом месте, несколько изменив его по сравнению с оригинальным. прошу прощения за неоднозначности.


теперь ответ: число с двоеточием после имени тега не находилось, потому что проверяющие шаблоны не поглощают символы, а лиш проверяют их наличие - я проверял, найдется перед числом двоеточие, когда перед ним уже имя тега (без двоеточия).

поэтому без особой лени двоеточие включаем в субпаттерн с числом : "/\[hello(\:\d+)\].*?\[\/hello\]/"
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог