【问题标题】:Notepad++ syntax highlight of embedded SQL in PHP filesPHP 文件中嵌入式 SQL 的 Notepad++ 语法高亮
【发布时间】:2020-03-29 00:55:32
【问题描述】:

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

问题:是否有可能让它对 SQL 做同样的事情,也许使用诸如 <<<sql ... sql 之类的 heredoc 分隔符?

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

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

编辑:按要求提供示例代码

<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 语言突出显示 &lt;&lt;&lt;sqlsql 之间的位。目前它(正确地)将其视为字符串文字,与带引号的字符串相同。

【问题讨论】:

  • Notepad++ 插件 SQLinForm 顺便说一句不起作用,因为当前版本坚持将其样式应用于整个脚本,尽管选择了“格式化选择的 SQL”。它也有自己的解析器,不应用我用于 SQL 文件的 NPP 样式。
  • 也许您可以添加一个小示例文件来显示不同的嵌入式语言部分?

标签: php sql notepad++ syntax-highlighting


【解决方案1】:

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

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

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

这一行有一个有效的SQL语句,但是这个语句是一个字符串,UDL将它识别为一个字符串,在标记SELECTWHERE之前

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

专业版:突出显示 GET SQL

CON:丢失的字符串在整个文件中突出显示

对我来说,付出比收获更重要

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

<<< sql ... sql?

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

【讨论】:

  • “特殊标记”是 PHP 的标准部分,并且已经在我的代码中。在 PHP 中,它们被称为“heredoc”字符串分隔符。您的解决方案还不错,但需要为 HTML+PHP+JavaScript+SQL 构建一个 UDL,其中包含所有关键字和一种配色方案。感谢您的建议,在将其标记为答案之前,我会考虑一下。
  • 阅读 stackoverflow.com/questions/8575865/… 让我意识到我会失去很多功能,我同意你的观点,我们可以放弃这个选项
【解决方案2】:

过去我也在考虑类似的事情,但我放弃了,因为 Notepad++ 没有其他语言格式的不同语言的 API 或配置。

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

经过几次搜索后,我发现: - PHP 没有合适的词法分析器,它只突出基本的东西,比如字符串(即用单引号/双引号括起来的东西,heredoc,nowdoc,...),变量(即带有$ 符号的东西),关键字,...你明白这点。 有关 heredoc 的定义,请参阅 https://github.com/notepad-plus-plus/notepad-plus-plus/blob/f02d166081fd5fcf7af14be1174910b2ec4f5656/PowerEditor/src/langs.model.xml。 - SQL/MySQL 有一个合适的词法分析器

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

唯一的可能性是直接挖掘 Notepad++ 代码(或扩展)。然后找到一种方法:

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

希望对你有所帮助。如果你发现一个简单的方法我会很高兴,你甚至可以提交一个 PR 来解析 PHP heredoc/nowdoc 中的 SQL。

【讨论】:

  • 感谢您的反馈@Mvorrisek。从那以后,我加入了 scintilla 论坛并建议将其作为一项功能。一等奖是让他们做出改变。我还将代码下载到了 scintilla 和 notepad++。从我对 C++ 的有限知识和阅读他们的代码来看,似乎需要从 scintilla 触发语言更改。我还看过为 NPP 编写插件,但还没有走得太远。很高兴知道其他人会发现该功能很有用。
【解决方案3】:

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

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

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

而且由于您直接连接到数据库,它会自动完成列名、表名等。

【讨论】:

  • 你怎么确定“没有办法改变”?这就是我追求的目的,我不会轻易放弃的。有人甚至可以找到破解 DLL 的方法。实际上,我过去完全按照您的建议进行了操作,但我发现这很乏味,而且 SQL 代码本身通常嵌入了 PHP,这使练习失败。正确着色代码可以让人们快速发现错误,而无需中断工作流程并使用其他工具。我将在“无法完成,做其他事情”类别中将此作为非答案投反对票
  • 让我重新表述一下 - 使用 Notepad++ 的当前功能无法改变这一点。它被硬编码到软件中。我不会认为“破解 DLL”是解决这个问题的合理解决方案。但是,如果您真的坚持要做到这一点,Notepad++ 是开源的。您可以从这里获取源代码的副本 - github.com/notepad-plus-plus/notepad-plus-plus - 进行所需的更改,然后重新编译它。哎呀,如果你让它正常工作,你甚至可以提交你的更改以包含在下一个版本中。
  • 不管怎样,我相信控制它的源代码文件是“notepad-plus-plus-master\scintilla\lexers\LexHTML.cxx”。您可以在第 569 行看到它添加了 Javascript、VBScript 和其他语言关键字。
  • 好吧,如果需要,可以重新编码 Notepad++ 和/或 scintilla。我会将赏金奖励给提出解决方案代码的人。
【解决方案4】:

在 NotePad++ 和/或 Scintilla 开发人员提出增强功能之前,我的解决方案是将 sql 代码复制到新选项卡中并选择 SQL 作为语言。

对于那些想要这样做的人,这里有一个宏来做到这一点。将其粘贴到您设置 NPP+ 以存储配置文件的文件夹中找到的 shortcuts.xml 文件(默认情况下,Windows 上为 %appdata%\notepad++)。选择 sql-code 然后按快捷键 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多