Я пытаюсь найти параметры вне кавычек (Single ou Double)
$sql = " INSERT INTO Notifify (to_email, msg, date_log, from_email, ip_from) VALUES ( :to_email, 'test teste nonono', '2013-02-01 10:48:27', 'bar@foo', :ip_from ) "; $matches = array(); preg_match_all('/:[A-Za-z0-9_]*/', $sql, $matches);
Вышеприведенный код даст следующий результат,
print_r($matches); // array(:to_email, :48, :27, :ip_from)
И я хочу только:
:to_email :ip_from
'/^\\s*:[A-Za-z0-9_]*/m'
Следует выполнить трюк, проверяя начало строки и пробел и убедитесь, что запрос RegEx установлен в многострочный.
редактировать
preg_match_all('/(?:^\\s*)(:[A-Za-z0-9_]+)/m', $sql, $matches); print_r($matches[1]);
Это использует пассивную группу без захвата (? :), которая помещает правильные результаты, без заполнения пробела в вспомогательный массив переменной совпадений в индексе 1.
Вы можете использовать негативный внешний вид. Таким образом, вы точно найдете то, что нужно.
preg_match_all('/(?<!\w):[a-z0-9_]+/', $sql, $matches);
демонстрация
Как насчет этого:
/\s+:[A-Za-z0-9_]*/
Он не очень строгий и может оказаться неудачным для более сложных примеров, таких как оценки тенниса ( 15 : 30
), но, вероятно, достаточно хорош для ваших нужд.