【问题标题】:PhpStorm 2016.2 find and replace multiline textPhpStorm 2016.2 查找和替换多行文本
【发布时间】:2020-06-22 18:11:22
【问题描述】:

在 PhpStorm 2016.2 中,我有一个新项目已被继承,并且 [严重] 需要更新。

有很多页面,每个页面都有这样的开头行(示例):

<?
include ("/inc/db.php");

我需要用几行替换这一行,例如:

<?php
include "siteheader.php";
require "class.myclass.inc.php";
$dataBase = new DbObj();

我之前只是将多行代码复制并粘贴到 PhpStorm 搜索/替换函数中,并且(通常但不总是)返回了正确的更改,尽管它们都被压缩成单行,使它们更难阅读 (@987654325 @ 字符被删除)。

  • 在这种情况下,我特别关注 “路径中的替换” 功能,因为我需要将此更改应用于许多页面。

我有Read the manual,但看不到这个选项。我想我可以使用正则表达式,但这并不理想(转义等)。

我也从PhpStorm Plugin Repository 中寻找但没有找到合适的插件。

有没有办法在 PhpStorm 2016.2 中搜索和/或替换路径中的多行文本?

干杯

【问题讨论】:

    标签: php phpstorm


    【解决方案1】:

    不幸的是,没有易于使用多行搜索或跨多个文件替换(Find/Replace in Path 功能)。

    现在您必须为此使用 Regex 选项——这是唯一有效的选项。

    观看这些票(星号/投票/评论)以获取有关这方面任何进展的通知。


    手动制作与正则表达式兼容的文本可能会有很大问题..因此您可以使用以下几步技巧:

    1. 在一个文件中输入您的新文本以开始
    2. 选择此类文本并调用 Replace in Path... 对话框 -- 预选正则表达式选项后,它应该会自动转义您的选择以与正则表达式兼容
    3. 将已经转义的文本复制到某处(只要剪贴板就足够了)
    4. 关闭对话框并返回原始文件
    5. 选择您要替换的文本并调用Replace in Path... 对话框——它将已经填写您的初始文本并且与正则表达式兼容
    6. 将之前复制的转义文本粘贴到替换字段中
    7. 执行查找/替换

    相关说明:https://stackoverflow.com/a/38672886/783119

    【讨论】:

    • 感谢 LazyOne 提供的信息。我会关注这些主题并希望它在未来的更新中出现:)
    • 您的文本框正则表达式指南效果很好。干杯。
    【解决方案2】:

    您可以在打开正则表达式选项的情况下进行多行查找和替换

    查找:

    <\?\ninclude \("/inc/db\.php"\);
    

    替换:

    <?php\ninclude "siteheader.php"; \nrequire "class.myclass.inc.php"; \n\$dataBase = new DbObj();
    

    如您所见,您需要做一些额外的工作来转义一些特殊字符并使用\n 而不是换行符,但它确实有效。我刚刚检查过了。

    附: 实际上,在以前的版本中可以简单地粘贴多行文本,但现在不可能了。 ;-(

    【讨论】:

    • 是的,到目前为止,正则表达式是我可以看到这个工作的唯一方法,但我想问一下是否有我错过的方法。感谢您的反馈
    • 还有Edit/Find/Replace Structurally... 选项可能很有趣,但它似乎不处理任何文本,只处理有效代码。我发现无法使用它来修改 PHP 开放标签(从 &lt;?&lt;?php),但可以很好地对整个项目进行多行替换。
    • 我可以将 PHP 标记单独添加到其中的代码中。我将探索更多结构搜索/替换可以提供的功能。谢谢你的信息,dragoste。
    【解决方案3】:

    键入 Alt+Enter 在“搜索”或“替换”字段中添加新行。

    【讨论】:

      【解决方案4】:

      在 Mac 上: 打开“查找”或“替换”工具,单击文本区域,然后为要创建的每个新行按一次以下键:

      ⌘ + 'Shift' + 'Enter'

      【讨论】:

        【解决方案5】:

        除了关于如何将正则表达式用于多行的建议之外,如果您想匹配两段中间任意行的代码,您可以使用[\s\S]* 而不是[\n.]*(它没有预期的结果)。示例:

        //you can match the $result-related code using `\$result([\s\S]*)while`
        
        $result = DB::exec($query);
        //blabla
        //something else
        while ($row = $result->fetch()) {
        

        【讨论】:

          【解决方案6】:

          \s 按预期工作以匹配所有空格和换行符。

          就我而言,我想找到 switch ... case ... continue; 语法,所以 switch(\s|.)*continue 按预期工作

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 2011-08-11
            • 2011-08-20
            相关资源
            最近更新 更多