PHP正则表达式问题!

PHP正则表达式问题!,php,html,regex,syntax,Php,Html,Regex,Syntax,我正在用PHP创建语法高亮器,但失败了!您可以看到,当我创建脚本注释(/)语法突出显示(灰色)时,我遇到了一些问题。所以我刚刚创建了一个语法突出显示函数的简化版本,向您展示我的所有问题。请参见每当在注释之间插入PHP变量(即,$example)时,它不会按照我的语法高亮显示而变灰。你看,我正在使用preg\u replace()来实现这一点。但是我目前使用的regex似乎不正确。我尝试了几乎所有我知道的关于它的东西,但它不起作用。请参阅下面的演示代码 问题演示代码 <?php $str

我正在用PHP创建语法高亮器,但失败了!您可以看到,当我创建脚本注释(
/
)语法突出显示(
灰色
)时,我遇到了一些问题。所以我刚刚创建了一个语法突出显示函数的简化版本,向您展示我的所有问题。请参见每当在注释之间插入PHP变量(即,
$example
)时,它不会按照我的语法高亮显示而变灰。你看,我正在使用
preg\u replace()
来实现这一点。但是我目前使用的
regex
似乎不正确。我尝试了几乎所有我知道的关于它的东西,但它不起作用。请参阅下面的演示代码

问题演示代码

<?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>';
  }
?>
提前感谢

重新发明轮子

此外,这也是为什么他们有解析器,而regex(尽管有流行的需求)不应该被用作解析器。

重新发明轮子


此外,这也是为什么他们有解析器,而regex(尽管流行需求)不应该被用作解析器。

就个人而言,我认为最好的选择是使用CSS选择器。用
class=“comment text”
替换
style=\“color:gray;\”
,用
class=“variable text”
替换
style=\“color:green;\”
,此CSS应该适用于您:

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

就个人而言,我认为最好的选择是使用CSS选择器。用
class=“comment text”
替换
style=\“color:gray;\”
,用
class=“variable text”
替换
style=\“color:green;\”
,此CSS应该适用于您:

.variable-text {
    color: #00E;
}
.comment-text .comment-text.variable-text {
    color: #DDD;
}
此处插入不使用正则表达式解析不规则语言

不管怎么说,看起来您遇到了一个典型的例子,说明了为什么正则表达式不适合解决这类问题。您最好研究一下PHP的功能

这里不要使用正则表达式来解析不规则语言


不管怎么说,看起来您遇到了一个典型的例子,说明了为什么正则表达式不适合解决这类问题。您最好研究一下PHP的功能

好吧,您似乎并不关心PHP已经有了这样的功能

但是由于php代码的结构,我们不能简单地使用正则表达式来实现这一点,也不能走进mordor(后者更容易)


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

好吧,您似乎并不关心php已经有了这样的函数

但是由于php代码的结构,我们不能简单地使用正则表达式来实现这一点,也不能走进mordor(后者更容易)


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

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

也就是说,我认为这是值得的精神锻炼。因此,您可以替换:

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

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

也就是说,我认为这是值得进行脑力锻炼的。因此,你可以取代:

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


由于PHP内置了这一功能,问题在于你为什么要这样做,而不是说这有什么帮助。你真的是在自力更生?为什么要重新发明轮子?由于PHP内置了这一功能,问题在于你为什么要这样做,而不是说这有什么帮助。你真的在自力更生?为什么要重新发明轮子?但这不是吗有一种使用
regex
的方法,因为我几乎不想创建自己的语法荧光笔,它具有与原始php语法荧光笔不同的出色颜色组合!请帮助我。@Jack:解决方法是不使用regex。regex对某些事情很好,但在解析方面,它不是。(您必须不断创建异常模式,以捕获其为变量名但不属于注释块的实例)。@Jack:您可以将其解析为临时字符串(
$temp=highlight_string(…)
),然后在其上运行字符串替换,例如,“所有颜色#FF00FF应变为#00FF00”(创建您自己的方案)。请参阅@cWallenPole的答案。使用CSS覆盖默认颜色scheme@Jack:Use,一个完全可自定义的语法荧光笔。但是有没有一种方法可以用
regex
来实现呢?因为我几乎不想创建自己的语法荧光笔,它的颜色组合与原始的php语法荧光笔不同!请帮我一把。@Jack:解决方案是不使用正则表达式。正则表达式在某些方面很好,但在解析方面却不行。(例如,如果它是一个变量名,但不属于注释块,则必须不断创建异常模式来捕获实例)。@Jack:您可以将其解析为临时字符串(
$temp=highlight\u string(…)
)然后在上运行字符串替换,例如“所有颜色#FF00FF应变为#00FF00”(创建您自己的方案)。请参阅@cWallenPole的答案。使用CSS覆盖默认颜色scheme@Jack:Use,一个完全可自定义的语法荧光灯。您试用过吗?我测试过了。请告诉我如何使用它?我已经添加了您应该使用的完整行,而不是您所拥有的。哦。我没有注意到您正在将
/
替换为
%%
。用编辑修复。你试过了吗?我测试过了。请告诉我如何使用它?我已经添加了你应该使用的完整行,而不是你所拥有的。哦。我没有注意到你正在用修复程序编辑的
/
替换
/