2010-07-20 36 views
1

$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);這是什麼規則表達式意思是

有沒有什麼地方我可以學習正則表達式?我知道基礎知識。

+4

http://www.regular-expressions.info/ – 2010-07-20 07:41:48

+0

無論誰在附近留下評論而寫這篇文章,都應該受到一些嚴厲的懲罰。 '* _ *' – deceze 2010-07-20 07:44:09

+0

這是考試的一個很好的問題!另外,查看哪些字符串與正則表達式匹配將會非常有趣。我覺得懶得「解密」它。 – 2010-07-20 07:44:56

回答

10

這似乎可以用來匹配的評論/* … */

  • /\*相匹配的領先的/*
  • [^*]*\*+匹配除*任何以下字符後面跟着一個或多個*
  • ([^/][^*]*\*+)* matche的Zero或字符的任何字符開始除/多個序列(以避免過早地結束,因爲最後一個字符是*),隨後除*任何字符,接着是一個或多個*
  • /結束相匹配/
+3

步行RegExp解析器。 +1 – Marko 2010-07-20 07:48:37

+0

哇優秀..爲什麼我沒有得到那個大聲笑..你總是給我的問題:)再次感謝..但我想它會刪除所有空白空間和行嗎?可以 ? – 2010-07-20 07:49:23

+0

不,它並不是因爲它必須以/ – 2010-07-20 07:51:22

13
!    # ... 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風格的評論。

+1

'O_O'真棒形象化!我喜歡「最後一閃」。 ; P – deceze 2010-07-20 08:16:48

+0

@deceze:哎呀斜線:p – kennytm 2010-07-20 08:20:30

+1

我喜歡ascii藝術:) – atamanroman 2010-07-20 11:51:12

0

這意味着有人喝醉了。

說真的,我甚至不想嘗試完全解碼,但它看起來像是用來代替正斜槓和星號的組合(例如刪除它們)。

這是正則表達式給正則表達式一個壞名字。

除了Chris對regular-expressions.info的建議之外,實際上應該查看PHP正則表達式的參考文檔,這些正則表達式實際上是PCREs(Perl Compatible Regular Expressions),這意味着您應該也可以通讀Perl正則表達式文檔。

它一直青睞,因爲我拿起它的一個版本,但我好像記得從奧賴利精通正則表達式是一本好書在正則表達式中:

0

走一步,一步一個腳印時間:

的!僅用作正則表達式開始/結束的分隔符,因此它們不用於匹配。

/\*匹配一個正斜槓後跟一個星號(星號是一個特殊字符,因此被反斜線轉義)。

[^*]*匹配0個或多個不是星號的字符。

\*+匹配一個或多個恆星。


[^/]匹配任何不是正斜槓

[^*]*匹配0個或更多字符不是明星。

\*+匹配一個或多個恆星。


括號內的最後一位,後面跟着一個星號,匹配該段0或更多次。

/匹配另一個正斜槓。

總的來說,它匹配/*asdf***asdfasdf***/之類的任何圖案,即它匹配那種風格的評論。

相關問題