2011-06-24 99 views
1

我在PHP中创建了一个Syntax Highlighter,但是我失败了!您在创建脚本注释时看到(//)语法高亮显示(gray),我遇到了一些问题。所以我刚创建了一个简短版本的语法高亮功能,向您展示我的所有问题。无论什么时候PHP变量,即$example,被插入到它未得到的评论之间grayed,因为它应该根据我的语法高亮显示。您看到我正在使用preg_replace()来实现此目的。但我目前使用的regex似乎并不正确。我尝试了几乎所有我知道的知识,但它不起作用。请参阅下面的演示代码。PHP正则表达式问题!

问题演示代码

<?php 
    $str = ' 
    <?php 
    //This is a php comment $test and resulted bad! 
    $text_cool++; 
    ?> 
    '; 
    $result = str_replace(array('<','>','/'),array('[',']','%%'),$str); 
    $result = preg_replace("/%%%%(.*?)(?=(\n))/","<span style=\"color:gray;\">$0</span>",$result); 
    $result = preg_replace("/(?<!\"|'|%%%%\w\s\t)[\$](?!\()(.*?)(?=(\W))/","<span style=\"color:green;\">$0</span>",$result); 
    $result = str_replace(array('[',']','%%'),array('&lt;','&gt;','/'),$result); 
    $resultArray = explode("\n",$result); 
    foreach ($resultArray as $i) { 
    echo $i.'</br>'; 
    } 
?> 

问题演示画面

enter image description here

所以你看到的结果,我想要的是$test在 '演示屏幕' 的注释字符串以上也应该着色为gray!(见下图)

enter image description here

谁能帮我解决这个问题吗?

I'm Aware of highlight_string() function! 

感谢提前!

+2

作为PHP有​​这种设施在建,还有一个*问题,为什么*你正在做它,而不是它有助于说。 – Orbling

+0

你真的在滚动你自己吗?为什么重新发明轮子? –

+3

请哥们帮帮我。 –

回答

3

我同意你应该使用现有的解析器。每个ide都有一个php解析器,许多人写了更多的解析器。

这就是说,我认为这是值得的心理锻炼。所以,你可以替换:

$result = preg_replace("/(?<!\"|')[\$](?!\()(.*?)(?=(\W))/","<span style=\"color:green;\">$0</span>",$result); 

//regular expression.: 
//#([^(%%%%|\"|')]*)([\$](?!\()(.*?)(?=(\W)))# 

//replacement text: 
//$1<span style=\"color:green;\">$2</span> 

$result = preg_replace("#([^(%%%%|\"|')]*)([\$](?!\()(.*?)(?=(\W)))#","$1<span style=\"color:green;\">$2</span>",$result); 
+0

我不认为这真的有效!但感谢您的建议。 –

+0

你试过了吗?我测试了它[这里](http://www.spaweditor.com/scripts/regex/index.php) –

+0

请告诉我如何使用它? –

6

重新发明轮子?

highlight_string()

同时,这也是为什么他们有解析器和正则表达式(尽管大众需求)应该作为一个解析器。

+0

但是''regex'没有这样做的方法,因为我几乎不想创建自己的Syntax荧光笔,它与原始的php语法荧光笔不同,颜色组合很好!请帮助我。 –

+0

@Jack:解决方案是不使用正则表达式。正则表达式适用于某些事情,但在解析方面,事实并非如此。 (例如,您必须继续制作异常模式以捕获它是变量名称的实例,但不属于注释块)。 –

+0

@Jack:你可以将它解析为一个临时字符串('$ temp = highlight_string(...)'),然后运行一个字符串替换,例如, “所有颜色#FF00FF应该变成#00FF00”(制作你自己的方案)。 –

2

就我个人而言,我认为你最好的选择是使用CSS选择器。更换style=\"color:gray;\"class="comment-text"style=\"color:green;\"class="variable-text"这个CSS应该为你工作:

.variable-text { 
    color: #00E; 
} 
.comment-text .comment-text.variable-text { 
    color: #DDD; 
} 
1

插入不使用正则表达式反正这里解析不规则的语言

,它看起来像你碰到的正则表达式不适合这类问题的一个主要例子。你最好看看PHP的highlight_string功能

0

那么,你似乎不在乎PHP已经有这样的功能。

但是由于php代码的结构,不能简单地使用正则表达式来实现这一点,或者步入魔芋(后者更容易)。

你必须使用解析器,否则你很快就会飞过杜鹃巢。