Regex найти контент не в кавычках

Я пытаюсь найти параметры вне кавычек (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 ), но, вероятно, достаточно хорош для ваших нужд.