Вот решение:
<?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]);
?>
Чтобы проверить его глубоко, я ввел в теги автоматического закрытия строки, например:
Я также вводил теги с:
Если вы найдете что-то, что не работает в доказательстве концепции выше, я доступен для анализа кода, чтобы улучшить свои навыки.
& 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;
Если кто-то заинтересован в обучении подробнее о шаблоне, я предоставляю некоторую строку:
Небольшой совет: чтобы лучше проанализировать этот код, необходимо посмотреть на исходный код, сгенерированный с тех пор, как я не представил любые специальные символы HTML.
Для вычитания в момент.js:
момент (). Вычитать (1, «месяцы»). Формат («ДД-ММ-ГГГГ»)
Документация: http://momentjs.com/docs/#/manipulating/subtract/
Используйте тот же код, но удалите месяц. Пример:
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);
}
Я бы отделил форматирование от извлечения. Вы можете сделать так, чтобы ваша существующая функция форматирования принимала необязательный параметр, который по умолчанию равен сегодняшнему дню, чтобы вы могли вызывать его так, как вы уже делали для сегодняшней даты.
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;
}
Поскольку желаемым форматом является дата 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
.
Вы должны вычитать месяцы, получая текущий месяц, затем вычитая количество месяцев, которое вы хотите, и затем обновляя переменную даты следующим образом.
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);
}