2015-08-27 6 views
-3

У меня есть тысячи строк следующие ниже структуры:Анализировать PHP из строки с помощью Regex

$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)"); 

Как я могу разобрать РНР о начале и конце строки, так что я могу иметь только действительный SQL заявление использовать?

Благодаря

+0

Почему бы не открыть в в текстовом редакторе и использовать находку и заменить функциональность? –

+0

Слово «разбор» используется несколько инфляционным. Это также просто соответствие текста/переписывание. – mario

ответ

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) 
0

Или в PHP вы можете использовать регулярное выражение с

"(.*)" 

, который будет возвращать строку в группе. Here for test

EDIT: для тех, кто не хочет следовать ссылке, вот реализация на PHP.

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

preg_match_all($re, $str, $matches); 
+0

Вам нужно добавить флаг 'g' для соответствия всем вхождениям. – Mike

+3

@Mike в PHP нет флага 'g'. –

+0

вам нужно использовать версию regex 'findall', если у вас действительно есть блок всех строк, или перебирайте каждую строку и создавайте свои данные. любой подход будет работать. –

1

Вместо разбора его можно выполнить его.

Если вы завернете его в кусок кода, который выводит его (на экран, в файл, на что угодно ...), вы можете захватить все запросы в любом случае. Это особенно полезно, если строки sql могут содержать переменные или экранированные символы. Это сделает анализ более сильным, но если вы просто выполните код, PHP сделает для вас тяжелую работу.

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 
) 
Смежные вопросы