2009-10-23 68 views
0

您好所有IM目前正在写“显示PHP代码”功能(输出可以在http://www.actwebdesigns.co.uk/web-design-mansfield/php-functions/display-code-function.php可见)的Preg匹配

与由正则表达式进行的颜色方案具有麻烦林。 尤其是2:

字符串:

$line = preg_replace("#(\s|\()(\"[^\"]*\")(\,|\))#is", "\\1<span class=\"string\">\\2</span>\\3", $line); 

(和试图)

#\"((?!(?:\"\s*;)|(?:\"\s*,)).)*#is 

和功能:

$line = preg_replace("#(\s*)(@?|!?[a-z]+(?:[a-z]|[0-9]|_)*)(\s*)\(([^\)]*)\)#is", "\\1<span class=\"function\">\\2\\3</span>(\\4)", $line); 

(如果函数是一个函数在其内部不会改变颜色

+0

你自我完善这样做还是你不知道'highlight_string()'? – 2009-10-23 08:29:50

回答

0

为什么这么复杂?使用hightlight_string()。 ...和输出缓冲和ini_set(),如果你需要改变它的输出。

+0

似乎没有做什么之后...似乎并没有突出功能等等,并输出到处都是。 – 2009-10-23 07:13:35

0

关于您的字符串的正则表达式:你说这是一个字符串,当且仅当它是由一个空格字符或(之前 它直接后跟一个,)。 针说,那是不正确的。你会错过像字符串:(?有更多的人,和什么有关“这里-文档”)

$s = "123";  // ends with a ; 
$s = "ab\"cd"; // contains an escaped double quote 
$t = 'efg' ; // is surrounded by single quotes 

仅举出三种。

为了考虑解决的情况下上面,尝试这样的事情:

$line = 's = "123"; t = "ab\\\\\\"cd"; u = \'efg\' ; v = \'ef\\\'g\' '; 
echo $line . "\n"; 
echo preg_replace('/((["\'])(?:\\\\.|(?:(?!\2).|[^\\\\"\'\r\n]))*\2)/', '<span class="string">$1</span>', $line); 
/* output: 
s = "123"; t = "ab\\\"cd"; u = 'efg' ; v = 'ef\'g' 
s = <span class="string">"123"</span>; t = <span class="string">"ab\\\"cd"</span>; u = <span class="string">'efg'</span> ; v = <span class="string">'ef\'g'</span> 
*/ 

的简短解释:

(      # start group 1 
    (["\'])    # match a single- or double quote and store it in group 2 
    (?:     #  start non-matching group 1 
    \\\\.    #  match a double quote followed by any character (except line breaks) 
    |     #  OR 
    (?:     #  start non-matching group 2 
     (?!\2).   #  a character other than what is captured in group 2 
     |     #  OR 
     [^\\\\"\'\r\n]  #  any character except a backslash, double quote, single quote or line breaks 
    )     #  end non-matching group 2 
)*      # end non-matching group 1 and match it zero or more times 
    \2      # the quote captured in group 2 
)      # end group 1 

然后关于你的第二个正则表达式的一些评论:您第一次尝试匹配零个或多个 空白字符。这可以安全地省略,因为如果不存在空格 你仍然有一个匹配。在匹配 函数名称之前,您可以使用\b(字边界)。另外,(?:[a-z]|[0-9]|_)可以替换为(?:[a-z0-9_])。而 这部分您正则表达式的:(@?|!?[a-z]+(?:[a-z]|[0-9]|_)*)这是一样的:

(
    @? 
    | 
    !? 
    [a-z]+ 
    (?: 
    [a-z] 
    | 
    [0-9] 
    | 
    _ 
)* 
) 

只有更好缩进,看看它实际上做。如果仔细观察,你会发现它只会匹配@?,并且由于?使得@成为可选项,所以 部分的正则表达式也会匹配空字符串。没有你期望的,呃?之后,我必须承认我已经停止了看那个正则表达式,最好把它扔掉。

尝试这样的事情来匹配函数名:

'/\b[a-z_][a-z0-9_]*(?=\s*\()/i' 

这意味着:

\b   # a word boundary (the space between \w and \W) 
[a-z_]  # a letter or an underscore 
[a-z0-9_]* # a letter, digit or an underscore, zero or more times 
(?=   # start positive look ahead 
    \s*  # zero ore more white space characters 
    \(  # an opening parenthesis 
)   # end positive look ahead 

这最后一个未测试的所有,我留给你。另外请注意,我知道PHP很少,所以我可能会过度简化它,在这种情况下,如果您提供了一些您想要作为函数匹配的示例代码片段,这将有所帮助。

另外一个谨慎的话,使用正则表达式-ES可能会非常棘手解析代码,但如果 你只使用它来执行代码片段的高亮,你 应该罚款。当源文件变大时,您可能会看到 性能的下降,并且您应该使正则表达式中的某些部分( )会增加匹配的运行时(特别是在较大的源文件上)。

最后,您可能重新发明了方向盘。您可以使用许多(测试良好的)代码荧光笔。我怀疑你已经知道这一点,但我认为它仍然值得一提。

仅供参考,我有很好的经验与这一个:http://shjs.sourceforge.net/doc/documentation.html