IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   preg_* регулярные выражения (https://www.imho.ws/showthread.php?t=133833)

Viro_man 17.07.2008 12:08

preg_* регулярные выражения
 
Здравствуйте, мне тут понадобилась помощь по регулярным выражениям, из того скудного разъяснения на php.net ничего толкового из этого почерпнуть нельзя, сами выражения не разложены и не объяснены, поэтому очень прошу, посоветуйте книгу в электронном виде, или какое нибудь руководство. Если можно, то предпочту либо на немецком, либо на русском, или на худой конец на английском.

Saruman 17.07.2008 12:43

хм, странное у тебя представление о "скудном разъяснении" - я так лично считаются пхпшную документацию по регэкспам одним из лучших мест в их документации вообще, в частности - Regexp details и regexp modifiers дают всю необходимую информацию.

Но если таки этого мало - в инете куча сайтов по регэкспам. Синтакс пхпных регэкспов практически идентичен перловому, поэтому любой запрос по regular expressions или perl regular expressions даст сразу кучу инфы, выбирай только на свой вкус. В частноти, вот сайт с примерами, туториалами и т.п.

Viro_man 17.07.2008 14:37

Saruman, охотно верю, просто видимо не нашёл сразу, ещё раз спасибо..

Viro_man 17.07.2008 15:54

Значит мне нужна помощь, как сделать, чтобы
$match="|<table[^>]+>(.*)</table>|U";
вот этот патерн, а точнее написание table было не чувствительно к большим буквам.

Код:

$html = "<tAble fefsefe=\"sdff\">bold text</table><a href=howdy.html>click me</a><table aaa=\"dddd\">neuertext<a her=aaaf>rgfdf</a></table>";
$match="|<table[^>]+>(.*)</table>|U";
preg_match_all($match, $html, $matches, PREG_SET_ORDER);
print_r($matches);


Viro_man 17.07.2008 16:55

Дозамутил :)
Код:

$match="|<((?i)table)[^>]+>(.*)</((?i)table)>|U";
вопрос снимается.

Viro_man 17.07.2008 17:59

Не совсем до конца замутил,
мне нужно, чтобы он съедал не только по типу <table id="o">ddsd</table>, но и <table>ddsd</table>

crawler 17.07.2008 22:55

$match="|<((?i)table)[^>]*>(.*)</((?i)table)>|U";

Hubbitus 18.07.2008 14:36

|<(table)[^>]*>(.*)</table>|Ui

DjArf 28.08.2008 22:12

Чтобы не поганить топик откровенно ламерским вопросом, спрошу здесь: как из строки вида
Код:

bla-bla-bla<tag>some text</tag>bla-bla-bla
выкусить "some text"?

добавлено через 55 минут
Вопрос снят. В джаббере Pahan-Hubbitus ответил:
Код:

#.*?<tag>(.*?)</tag>.*#
добавлено через 24 минуты
и пояснения от Pahan-Hubbitus:
Цитата:

# - соответственно ограничитель, начальный и конечный.
. - что-либо. По сути все что угодно, любой символ (за исключением переносов строк, если не указан модификатор s, за подробностями в МАН). Если модификаторами шаблон не заякорен (anchored) то можно опустить. На всякий случай привел. Должно и без него быть нормально, в данной ситуации (собственно данных-то маловато что делаете и чем и на чем).
* - Квантификатор "ноль или больше". Действует на впереди стоящий символ или выражение (в данном случае точку)
? - инверсия жадности квантификатора (angry). По-умолчанию квантификаторы "жадные", то есть захватывают столько, сколько могут захватить (при случае с точкой это будет до конца). Подробности также в МАНе.
<tag> и </tag> - ну тут собственно все понятно, прямое совпадение с текстом
(.*?) - Кроме скобок все описано выше. СОбственно скобки значат что нужно захватить этот субпаттерн (subpattern). В случае с PHP preg_match скажем, это значит что совпадением будет заполнен какраз массив $matches. Ну собственно самое главное, что искали.

Saruman 28.08.2008 23:02

по краям .* не нужна, т.к. не стоит привязки к началу/концу стринга - соответственно, матч будет в любом месте, и вот такого регэкспа вполне достаточно: #<tag>(.*?)</tag>#

Hubbitus 29.08.2008 01:10

Цитата:

Сообщение от Saruman (Сообщение 1584854)
по краям .* не нужна, т.к. не стоит привязки к началу/концу стринга - соответственно, матч будет в любом месте

Ага. Так это же и написано:
Цитата:

Сообщение от DjArf (Сообщение 1584831)
Если модификаторами шаблон не заякорен (anchored) то можно опустить. На всякий случай привел. Должно и без него быть нормально, в данной ситуации (собственно данных-то маловато что делаете и чем и на чем).


Den+ 31.08.2008 02:16

главное, чтобы в предварительном "bla-bla-bla" не попалась пара тегов <tag></tag>, а то попадутся в выборке именно они!


Часовой пояс GMT +4, время: 19:04.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.