关于您的字符串的正则表达式:你说这是一个字符串,当且仅当它是由一个空格字符或(
之前 它直接后跟一个,
或)
。 针说,那是不正确的。你会错过像字符串:(?有更多的人,和什么有关“这里-文档”)
$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
你自我完善这样做还是你不知道'highlight_string()'? – 2009-10-23 08:29:50