Что означает это регулярное выражение - PullRequest
1 голос
/ 20 июля 2010

$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);

И есть ли место, где я могу выучить регулярные выражения?Я знаю основы.

Ответы [ 5 ]

13 голосов
/ 20 июля 2010
!             # ... Beginning of the regex...
    /         # 1. Match a slash
    \*        # 2.  and an asterisk
    [^*]*     # 3.   followed by some non-asterisks
    \*+       # 4.    and then at least 1 asterisks
    (         #    And then some groups of
     [^/]     # 5.  match a non-slash
     [^*]*    # 6.   followed by some non-asterisks
     \*+      # 7.    and then at least 1 asterisks
    )*        #
    /         # 8. And finally a slash
!             # ... End of the regex ...
                                         .——————<—————————————<————————————.
                .———<——.       .——<——.   |          .——<———.       .——<——. |
                |      |       |     |   |          |      |       |     | |
[ / ]—>—[ * ]—>—o—[^*]—' .—>—[ * ]—>—o—>—o—>—[^/]—>—o—[^*]—' .—>—[ * ]—>—o—' .—>—[ / ]
                |        |               |          |        |               |
                '————>———'               |          '———>————'               |
                                         '——————>——————————————>—————————————'

  1       2        3*          4+        (    5         6*         7+      )*      8 

Пример экземпляра:

/* blah *** f /* foo*** */
12333333444566675666777578

Используется для удаления комментариев в стиле C.

10 голосов
/ 20 июля 2010

Это, кажется, используется, чтобы соответствовать комментариям /* … */:

  • /\* соответствует ведущему /*
  • [^*]*\*+ соответствует любым следующим символам, кроме *, за которым следует один или несколько *
  • ([^/][^*]*\*+)* соответствует нулю или более последовательностей символов, начинающихся с любого символа, кроме / (чтобы избежать преждевременного завершения, поскольку последний символ - *), за которым следует любой символ, кроме *, за которым следует один или несколько *
  • /соответствует окончанию /
1 голос
/ 20 июля 2010

Он делает то, что говорит в комментарии над этой строкой.Он удаляет комментарии (из файлов CSS).

Вы, вероятно, нашли его в

0 голосов
/ 20 июля 2010

Делая вещи по одному шагу за раз:

The! просто используются в качестве разделителя для начала / конца регулярного выражения, поэтому они не используются для сопоставления.

/\* соответствует косой черте, за которой следует звезда (звезда является специальным символом, поэтому экранируется обратной косой чертой).

[^*]* соответствует 0 или более символам, которые не являются звездами.

\*+ соответствует одной или нескольким звездам.


[^/] соответствует всему, кроме косой черты

[^*]* соответствует 0 или более символам, которые не являются звездами.

\*+ соответствует 1 или более звездочек.


Последний бит в скобках, за которым следует звезда, соответствует этому разделу 0 или более раз.

/ соответствует другому слешу.

В целом, соответствует любому шаблону, например /*asdf***asdfasdf***/, то есть соответствует стилю комментария.

0 голосов
/ 20 июля 2010

Это значит, что кто-то был пьян.

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

Это тот тип регулярных выражений, который дает регулярное выражение плохому имени.

В дополнение к предложению Криса о регулярных выражениях, вы должны просмотреть справочные документы по регулярным выражениям PHP, которые на самом деле являются PCRE (регулярными выражениями, совместимыми с Perl), то есть, вероятно, вам также следует прочитать документы регулярных выражений Perl. 1007 *

Прошло много лет с тех пор, как я взял его редакцию, но, похоже, я вспоминаю, что «Освоение регулярных выражений» от О'Рейли было хорошей книгой о регулярных выражениях в целом:

...