2010-07-20 73 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***/之类的任何图案,即它匹配那种风格的评论。

相关问题