使用正则表达式

时间:2015-08-27 21:28:30

标签: php sql regex parsing

我有以下结构的数千行:

$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语句?

由于

4 个答案:

答案 0 :(得分:1)

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

如果你将它包装在一段输出它的代码中(到屏幕,文件,到任何......),你可以随心所欲地捕获所有的查询。如果sql字符串也可能包含变量或转义字符,则此功能尤其有用。这会使解析变得更难,但如果您只是执行代码,PHP将为您完成艰苦的工作。

class Output {

  function addSql($sql) {
     echo "$sql\n";
  }

  function output() {

     // Paste that code of yours here

  }

}

$x = new Output();
$x->output();

答案 1 :(得分:0)

您可以尝试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)

答案 2 :(得分:0)

或者在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);

答案 3 :(得分:0)

这可能有效,但仅适用于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
 )