Покритикуйте подход и реализацию?

Вурдалак

Продвинутый новичок
SQL конструктор? Это типа query builder? Так там же такая же фигня с литералами будет. Тут ничего на куски помимо этого и не разбирается. Там ну разве что с LIMIT всё ясно.
 

MiksIr

miksir@home:~$
А это зависит от сложности конструктора. В случаях когда 'field' => $value - вообще плейсхолдеры не нужны, а тип данных можно по метадате из таблицы брать. Хотя в итоге получится опять же монстр. С другой стороны, регулярки ничем не лучше.
 

Фанат

oncle terrible
Команда форума
Вурдалак
ты словами лучше объясни - зачем сначала литерал из запроса вынимать, а потом обратно вставлять без изменений.
Почему его нельзя вообще не трогать?
я реально туплю. не могу понять - зачем это надо
 

Вурдалак

Продвинутый новичок
Фанат, новый код из запроса
Код:
SELECT '?i', ?i
вытащит литерал и placeholder. А старый код нашёл бы 2 placeholder'а. Другими словами, мы должны знать в каком контексте он встретился: если в контексте литерала, то это вовсе не placeholder.

«Не трогать» его, конечно, можно. Но это уже будет решение не на регулярных выражениях, а «ручной» парсинг (автоматы там или попроще).
 

Фанат

oncle terrible
Команда форума
Если считать, что знаки вопроса экранировать придётся только в строковых литералах, то можно так:
PHP:
$pattern = '/"(?:\\\\.|[^"])*+"|\'(?:\\\\.|[^\'])*+\'|\?[a-z]/';
preg_match_all() или preg_split(), там есть свои плюсы и минусы.

Правда для каждой СУБД свой паттерн будет, т.к. в MySQL символы экранируются с помощью бэкслэша, а в каком-нибудь MS SQL — удваиванием символа ограничителя.
Давай вернемся к этому вопросу.
Насколько я помню, этот рег возвращает закавыченные участки наряду с плейсхолдерами. Это приемлемое решение, но мне кажется более правильным, если рег будет попросту пропускать все закавыченные участки, и таким образом у нас запрос будет разбит только по плейсхолдерам.
 

riff

Новичок
если рег будет попросту пропускать все закавыченные участки и таким образом у нас запрос будет разбит только по плейсхолдерам
Как я понял, прочитав тему, ты просто не сможешь составить такое рег. выраж.
У меня не получилось.
 

WMix

герр M:)ller
Партнер клуба
может разбивать на токины?
PHP:
$pattern = "~(?:\"(?P<dq>[^\"]+)\"|(?:'(?P<sq>[^']+)'|(?P<nq>[^\"']+)))~";
$string = "текст, еще \"в ковычках\"; \"с 'ковычками'\", 'заковычиный', 'заковычиный \"в ковычках\"' hello;world";
preg_match_all($pattern, $string, $m);
print_r($m);
 

Фанат

oncle terrible
Команда форума
Блин точно. Там же ещё экранирование. Ох моя бедная голова...
 

riff

Новичок
Может пока сделать без оглядки на ( 'текст ? текст' ), а потом, когда всё остальное утрясётся, подумать, что делать с текстовыми данными в sql?
 

fixxxer

К.О.
Партнер клуба
В принципе рекурсивным регулярками такое распарсить можно, но голова опухнет раньше
 
Сверху