【问题标题】:Parse PHP out of string using Regex [closed]使用正则表达式从字符串中解析 PHP [关闭]
【发布时间】:2015-11-22 10:45:28
【问题描述】:

我有数千行遵循以下结构:

$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (45824, 'TCP', 'DAI ', 0)");
$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (47001, 'TCP', 'WinRM', 0)");
$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (47808, 'UDP', 'BACnet', 0)");
$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (48653, 'TCP', 'Robot', 0)");
$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (48653, 'UDP', 'Robot', 0)");
$this->addSql("INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (49151, 'TCP', 'Reserved', 0)");

如何解析出行首和行尾的 php,以便我可以使用有效的 sql 语句?

谢谢

【问题讨论】:

  • 为什么不打开文本编辑器并使用查找和替换功能?
  • “解析”这个词的使用有点夸张。这也只是文本匹配/重写。

标签: php sql regex parsing


【解决方案1】:

这可能有效,但仅适用于 sql 行。
替换为空字符串。

'~(?m)(?:^[^"\r\n]*\(\h*"\h*|\h*"\h*\)[^"()\r\n]*$)~'

Formatted:

 (?m)                    # Multi-line mode
 (?:
      ^                       # BOL
      [^"\r\n]* \(    
      \h* " \h* 
   |                        # or,
      \h* " \h*          
      \) [^"()\r\n]* 
      $                       # EOL
 )

【讨论】:

    【解决方案2】:

    或者在 PHP 中,您可以使用带有

    的正则表达式
    "(.*)"
    

    这会将字符串作为一个组返回。 Here for test

    编辑:对于那些不想点击链接的人,这里有一个 PHP 实现。

    $re = "/\"(.*)\"/"; 
    $str = "\$this->addSql(\"INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (45824, 'TCP', 'DAI ', 0)\")"; 
    
    preg_match_all($re, $str, $matches);
    

    【讨论】:

    • 您需要添加g 标志以匹配所有匹配项。
    • @Mike PHP 中没有 g 标志。
    • 如果你真的有一个包含所有行的块,你需要使用findall 版本的正则表达式,或者遍历每一行并建立你的数据。两种方法都行。
    【解决方案3】:

    您可以执行它,而不是解析它。

    如果您将其包装在一段代码中并输出它(到屏幕、到文件、到任何...),您可以捕获所有您喜欢的查询。如果 sql 字符串也可能包含变量或转义字符,这将特别有用。这会使解析变得更加困难,但如果您只是执行代码,PHP 会为您完成这项艰巨的工作。

    class Output {
    
      function addSql($sql) {
         echo "$sql\n";
      }
    
      function output() {
    
         // Paste that code of yours here
    
      }
    
    }
    
    $x = new Output();
    $x->output();
    

    【讨论】:

      【解决方案4】:

      你可以试试cut:

      cut -d '"' -f2 file.sql
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (45824, 'TCP', 'DAI ', 0)
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (47001, 'TCP', 'WinRM', 0)
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (47808, 'UDP', 'BACnet', 0)
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (48653, 'TCP', 'Robot', 0)
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (48653, 'UDP', 'Robot', 0)
      INSERT INTO PortsList (Port, Proto, Name, Encrypted) VALUES (49151, 'TCP', 'Reserved', 0)
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 2011-01-28
        相关资源
        最近更新 更多