PHP 文件中嵌入 SQL 的 Notepad++ 语法高亮显示

Notepad++ syntax highlight of embedded SQL in PHP files

Notepad++ 与 Scintilla 词法分析器一起工作,以某种方式识别 .php 文件中的语言切换。它似乎默认为 HTML 并将 <?php ... ?><script type="text/javascript">...</script> 识别为嵌入式 PHP 和 javascript 语言的分隔符,从而应用正确的语法突出显示和代码完成.

问题:是否可以让它为 SQL 做同样的事情,或许使用 <<<sql ... sql 等 heredoc 定界符?

我搜索了网络和记事本++论坛,但没有成功。 UDL 根据文件的扩展名处理文件的内容,这无济于事,因为我专门在 .php 文件中查找代码 embedded。我还尝试在记事本的 ProgramData 文件夹中挖掘文件,但找不到任何定义语言切换定界符的内容。

SQL 的记事本插件都希望将文件的全部内容格式化为 sql,所以这也无济于事,我只想让它与 [=30] 一起使用=]仅限嵌入式 部分。事实上,我宁愿找到一个没有插件的解决方案。

编辑:请求的示例代码

<p>Some html code here</p>
<?php
$value1 = 1234;
$sql = <<<sql
select * from table1
where column1 = $value1
sql;
$rows = mysqli->query($sql);
?>
<script type="text/javascript">
var results = <?php echo queryToJSresults($rows);?>;
</script>

一切都是在 Notepad++ 中正确突出显示的语法。我想要的是使用语言 SQL 语法突出显示 <<<sqlsql 之间的位。目前,它(正确地)将其视为字符串文字,与带引号的字符串相同。

Notepad++ 仅在某些情况下识别嵌入式语言(如 php 内的 javascript 或 html 内的 javascript),并且这些情况是硬编码的。无法更改该行为或添加其他嵌入式语言。

就我个人而言,我使用 MySQL Workbench 来构建和测试我的查询,然后在它们准备就绪后将它们移到我的服务器端代码中。

MySQL Workbench 在语法高亮、自动完成等方面做得很好

并且由于您直接连接到数据库,它会自动完成列名称、table 名称等

你要做的事情太难了。可以使用用户定义语言 (UDL) 工具完成,但我认为不会得到您期望的确切结果。

假设您要打开一个 .php 文件扩展名并获取以下行:

$result = mysql_query('SELECT * WHERE 1=1');

这一行有一个有效的SQL句,但是这句是字符串,UDL将其识别为字符串,先于标记SELECTWHERE

您可以创建一个全新的 UDL,与 PHP 的原生 Notepad++ 完全相同,但放弃字符串的突出显示。然后,添加保留的 SQL 键以突出显示(SELECT、FROM、IN 等)。

PRO: GET SQL Highlighted

CON: LOST strings highlight in the whole file

对我来说,代价大于收获

根据您的建议添加特殊标记

<<< sql ... sql?

这将使文件无法编译,所以我将放弃此选项。

以前我也想过类似的东西,但我放弃了,因为Notepad++没有API或另一种语言格式的不同语言的配置。

查看源代码中<?php的搜索结果: https://github.com/notepad-plus-plus/notepad-plus-plus/search?l=C%2B%2B&q=%22%3C%3Fphp%22

经过另外几次搜索,我发现: - PHP 没有合适的词法分析器,它只突出显示基本的东西,比如字符串(即包含在 single/double 引号中的东西、heredoc、nowdoc,...)、变量(即带有 $ 符号的东西), 关键字, ... 你明白了。 有关 heredoc 定义,请参阅 https://github.com/notepad-plus-plus/notepad-plus-plus/blob/f02d166081fd5fcf7af14be1174910b2ec4f5656/PowerEditor/src/langs.model.xml。 - SQL/MySQL 有一个合适的词法分析器

根据这项快速研究,您无法 rewrite/generate php 规则仅通过编辑规则文件来完全支持 SQL 或其中的任何其他词法分析器。

唯一的可能是直接深入 Notepad++ 代码(或扩展)。然后想办法:

  1. 在PHP
  2. 中找到一个字符串部分
  3. 如何将字符串部分传递给 SQL 词法分析器并将其用作该部分的高亮字符

希望对你有所帮助。如果您发现一种简单的方法,我将非常高兴,您甚至可以提交 PR 以解析 PHP heredoc/nowdoc.

中的 SQL

在 NotePad++ and/or Scintilla 开发人员提出改进之前,我的解决方案是将 sql 代码复制到新选项卡中,并将 select SQL 作为语言.

对于那些想做同样事情的人,这里有一个宏可以做到这一点。将此粘贴到您设置 NPP+ 以存储配置文件的文件夹中找到的 shortcuts.xml 文件(默认情况下 windows 上的 %appdata%\notepad++)。 Select sql-代码然后按快捷键Ctrl~(您可以根据需要更改它) .

<Macro name="SQL view" Ctrl="yes" Alt="no" Shift="no" Key="192">
    <Action type="0" message="2178" wParam="0" lParam="0" sParam=""/>
    <Action type="0" message="2025" wParam="0" lParam="0" sParam=""/>
    <Action type="0" message="2422" wParam="0" lParam="0" sParam=""/>
    <Action type="0" message="2325" wParam="0" lParam="0" sParam=""/>
    <Action type="2" message="0" wParam="41001" lParam="0" sParam=""/>
    <Action type="0" message="2179" wParam="0" lParam="0" sParam=""/>
    <Action type="2" message="0" wParam="46020" lParam="0" sParam=""/>
</Macro>