Ваше регулярное выражение PHP содержит ошибку, а именно, круглые скобки группы 1 обертывают весь шаблон, в то время как возвращаемая часть должна быть только ([0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])
.
Итак, чтобы исправить PHP шаблон, вам нужно удалить внешние скобки:
^([0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]))(?:,\s*(?1))*$
Поскольку подпрограмма регулярного выражения (?1)
рекурсирует шаблон группы 1, все, что вам нужно, это повтор паттерн в JS регулярном выражении:
^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])(?:,\s*[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]))*$
См. это демонстрационное выражение регулярного выражения .
В JS коде, не пишите его как литерал регулярного выражения, создайте его динамически для упрощения обслуживания:
const date_reg = `[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])`;
const reg = new RegExp(String.raw`^${date_reg}(?:,\s*${date_reg})*$`);
console.log(reg.test("2017-03-25, 2017-03-27, 2017-03-28"));