Регулярные выражения — жадность, ленивость. Берём текст между скобок.

govnoproger.ru > интернет > Регулярные выражения — жадность, ленивость. Берём текст между скобок.

В регулярных выражениях есть жадность и ленивость.
Я не являюсь сторонником их использования.
Давайте рассмотрим примеры, вы поймёте почему не стоит их использовать.

Итак у нас есть текст: [ggdfshgkfdshjksfdjgkdskhdsfhgb]
Нам нужно получить то что между скобочек. Это очень распространённое задание.

Напомню про сервис preg_match_all-online

Жадное выражение:

/\[(.+)\]/

Так напишет любой дурак. Регулярное выражение коментариев не требует, я просто использую группу которая берёт точку с плюсом.
Давайте изменим текст на [[[ggdfshgkfdshjksfdjgkdskhdsfhgb]]]

Итак мы не знаем уровень вложенности скобок.

Запускаем, смотрим что получается в итоге:

Array
(
    [0] => Array
        (
            [0] => [[[ggdfshgkfdshjksfdjgkdskhdsfhgb]]]
        )

    [1] => Array
        (
            [0] => [[ggdfshgkfdshjksfdjgkdskhdsfhgb]]
        )

)

Обратите внимания как сработало регулярное выражение.
Смотрим массив [1][0]. Регулярка начала пахать с первой скобки и до самой последней.
Ей было все-равно что на пути у неё другие скобки.

Ленивое выражение:

/\[(.+?)\]/

Запускаем, смотрим что получается в итоге:

Array
(
    [0] => Array
        (
            [0] => [[[ggdfshgkfdshjksfdjgkdskhdsfhgb]
        )

    [1] => Array
        (
            [0] => [[ggdfshgkfdshjksfdjgkdskhdsfhgb
        )

)

Тоже смотрим на туже группу в массиве. Остановка произошла после первого вхождения.

Выводы:
Ленивость и жадность это хрень. Их эффективность и надобность весьма сомнительна. В случае лишних скобок вы сами видели что произошло. Нам нужно нечто более надёжное.

Я всегда делаю через отрицание:

/\[([^\[\]]+)\]/

Запускаем, смотрим что получается в итоге:

Array
(
    [0] => Array
        (
            [0] => [ggdfshgkfdshjksfdjgkdskhdsfhgb]
        )

    [1] => Array
        (
            [0] => ggdfshgkfdshjksfdjgkdskhdsfhgb
        )

)

Это выражение сложнее и требует объяснения. Начнём слева:
\[ это просто часть нашей скобочки
([^\[\]]+) тут не читаем круглые скобки, тк это просто группа. Смотрим только на [^\[\]]+
Читается как не символ (^) открытой квадратной (\[) или закрытой квадратной скобки (\]) от единицы и более совпадений ([]+). Тк скобки это спецсимвол- я их заэкранировал обратным слэшем.
\] дальше идёт закрывающая скобка.

Одним словом я сделал отрицание нескольких символов.

Рекомендую:

4.6.2011 | последняя редакция: 04.06.2011 |
  1. prixod
    14.3.2012 в 23:36

    привет! Как взять текст от слова до слова, выкинув html тэги?

    написал вот так #слово1([^»]+)слово2# — и теги остаются. что в регулярку нужно добавить, чтобы выкинуть все не нужное?))

  2. admin
    15.3.2012 в 00:00

    Я так понимаю штмл меж словами?
    Сделай stip_tags, так будет лучше.

  3. prixod
    15.3.2012 в 10:59

    ok. Спасибо! потыкаю) И еще вопросикс. Какой функцией можно убрать пустые строки из txt?

    например:

    тряляля это текст это текст это текст это текст

    тряляля это текст это текст это текст это текст

    тряляля это текст это текст это текст это текст
    тряляля это текст это текст это текст это текст

    — вот как сделать чтобы было вот так:

    тряляля это текст это текст это текст это текст
    тряляля это текст это текст это текст это текст
    тряляля это текст это текст это текст это текст
    тряляля это текст это текст это текст это текст

    Зарание спасибо)

  4. admin
    15.3.2012 в 13:04

    Прежде чем спрашивать вводи в гугл. Можно так

    <?php  
     file_put_contents('lines2.txt',file('lines.txt', FILE_SKIP_EMPTY_LINES)); 
    ?>
  5. prixod
    15.3.2012 в 18:24

    Огромное спасибо за пинок)) я соединяю php и xhe

  6. prixod
    15.3.2012 в 18:26

    Да и простите за нубизм. моим знаниям в php несколько недель))