Удаление проблемы 1 месяц от даты - Получить месяц 0 [дубликаты]

Вот решение:

<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

Чтобы проверить его глубоко, я ввел в теги автоматического закрытия строки, например:

  1. & lt; hr / & gt;
  2. & lt; br / & gt;
  3. & lt; br & gt;

Я также вводил теги с:

  1. один атрибут
  2. содержит более одного атрибута
  3. , значение которого привязано либо в одинарные кавычки, либо в двойные кавычки
  4. атрибуты, содержащие одинарные кавычки, когда разделитель является двойным цитата и наоборот
  5. «нечеткие» атрибуты с пробелом перед символом «=» после него и до и после него.

Если вы найдете что-то, что не работает в доказательстве концепции выше, я доступен для анализа кода, чтобы улучшить свои навыки.

& lt; EDIT & gt; Я забыл, что вопрос от пользователя заключался в том, чтобы избежать разбора самозакрывающихся тегов. В этом случае шаблон проще, превратившись в это:

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

Пользователь @ridgerunner заметил, что шаблон не позволяет без кавычек атрибутов или атрибутов без значения. В этом случае тонкая настройка приводит к следующему шаблону:

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

& lt; / EDIT & gt;

Понимание шаблона

Если кто-то заинтересован в обучении подробнее о шаблоне, я предоставляю некоторую строку:

  1. первое подвыражение (\ w +) соответствует имени тега
  2. , второе подвыражение содержит шаблон атрибут. Он состоит из: одного или нескольких пробелов \ s + имя атрибута (\ w +) ноль или более пробелов \ s * (возможно или нет, оставляя здесь пробелы) символ "=" снова, ноль или более пробелов разделитель значения атрибута, одинарная или двойная кавычка («|»). В шаблоне одиночная кавычка экранируется, потому что она совпадает с разделителем строки PHP. Это подвыражение захватывается скобками, поэтому на него можно ссылаться снова для синтаксического анализа закрытия атрибута, поэтому очень важно значение атрибута, сопоставляемое почти : (. *?); в этом конкретном синтаксисе, используя жадное соответствие ( вопросительный знак после звездочки), механизм RegExp позволяет использовать оператор «look-ahead», который соответствует чему-либо, но что следует за этим подвыражением, здесь весело: элемент \ 4 является оператором обратной ссылки, который ссылается на подзадачу, выражение, определенное ранее в шаблоне, в данном случае я имею в виду четвертое подвыражение, которое является первым a ttribute delimiter обнаружен ноль или более пробелов \ s * конец суб-выражения атрибута заканчивается здесь, с указанием нуля или более возможных вхождений, заданных звездочкой.
  3. Затем, поскольку тег может заканчиваться пробелом перед «& gt;», символ, ноль или более пробелов сопоставляются с подшаблоном \ s *.
  4. Тег, который должен соответствовать, может заканчиваться простым «& gt;» символ или возможное закрытие XHTML, которое использует перед ним косую черту: (/> |>). Слэш, конечно, сбежал, поскольку он совпадает с разделителем регулярных выражений.

Небольшой совет: чтобы лучше проанализировать этот код, необходимо посмотреть на исходный код, сгенерированный с тех пор, как я не представил любые специальные символы HTML.

0
задан Learning2Code 17 January 2019 в 16:44
поделиться

5 ответов

Для вычитания в момент.js:

момент (). Вычитать (1, «месяцы»). Формат («ДД-ММ-ГГГГ»)

Документация: http://momentjs.com/docs/#/manipulating/subtract/

0
ответ дан Carlos Vieira 17 January 2019 в 16:44
поделиться

Используйте тот же код, но удалите месяц. Пример:

function fetchTime() {
  var today = new Date();
  today.setMonth(today.getMonth() - 1);
  var dd = today.getDate();
  var mm = today.getMonth() + 1;
  var yyyy = today.getFullYear();
  if (dd < 10) {
    dd = '0' + dd;
  }
  if (mm < 10) {
    mm = '0' + mm;
  }
  var today = yyyy + '-' + mm + '-' + dd;
  return (today);
}
0
ответ дан MarcusVinnicius 17 January 2019 в 16:44
поделиться

Я бы отделил форматирование от извлечения. Вы можете сделать так, чтобы ваша существующая функция форматирования принимала необязательный параметр, который по умолчанию равен сегодняшнему дню, чтобы вы могли вызывать его так, как вы уже делали для сегодняшней даты.

 function formatTime(date) {
  var dateToFormat = date || new Date();
  var dd = dateToFormat.getDate();
  var mm = dateToFormat.getMonth() + 1;
  var yyyy = dateToFormat.getFullYear();
  if (dd < 10) {
    dd = '0' + dd;
  }
  if (mm < 10) {
    mm = '0' + mm;
  }

  return (yyyy + '-' + mm + '-' + dd);
}

Тогда вы можете также назвать его с сегодняшней датой минус месяц или любая другая дата

    formatTime(); //will default to today
    var today = new Date();
    formatTime(addMonths(today,-1)); //format last month's date

Как указал РобГ в комментариях, вам нужно будет реализовать функцию addMonths, как в [ 113] Добавление месяцев к дате в JavaScript

function addMonths(date, months) {
  var d = date.getDate();
  date.setMonth(date.getMonth() + +months);
  if (date.getDate() != d) {
    date.setDate(0);
  }
  return date;
}
0
ответ дан Learning2Code 17 January 2019 в 16:44
поделиться

Поскольку желаемым форматом является дата ISO 8601, вы можете использовать .toISOString в JavaScript. Однако вас интересуют только первые 10 символов (не время ), поэтому вы хотите добавить .substring(0,10).

Date.prototype.toISODateString = function() { return this.toISOString().substring(0,10); }
Date.prototype.addMonths = function(val) { this.setMonth(this.getMonth()+val); return this;}

var date = new Date();
var todayFormatted = date.toISODateString();
console.log(todayFormatted);

var lastMonthFormatted = date.addMonths(-1).toISODateString();
console.log(lastMonthFormatted);            

Я сделал шаги форматирования функцией под названием toISODateString() и добавил ее в прототип Date, который является причудливый способ сказать «Вы можете связать .toISODateString() с любым Date сейчас».

Чтобы установить дату месяца, я использовал .setMonth(). Я также превратил это в функцию под названием addMonths.

0
ответ дан Tyler Roper 17 January 2019 в 16:44
поделиться

Вы должны вычитать месяцы, получая текущий месяц, затем вычитая количество месяцев, которое вы хотите, и затем обновляя переменную даты следующим образом.

function fetchTime() {
  var today = new Date();
  today.setMonth(today.getMonth() - 1);
  var dd = today.getDate();
  var mm = today.getMonth() + 1;
  var yyyy = today.getFullYear();
  if (dd < 10) {
    dd = '0' + dd;
  }
  if (mm < 10) {
    mm = '0' + mm;
  }
  var today = yyyy + '-' + mm + '-' + dd;
  return (today);
}
0
ответ дан 17 January 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: