Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Подскажите код, который бы искал все даты типа XX.XX.XXXX и заменял их чем-то (https://javascript.ru/forum/jquery/69958-podskazhite-kod-kotoryjj-iskal-vse-daty-tipa-xx-xx-xxxx-i-zamenyal-ikh-chem.html)

Stenli 30.07.2017 21:50

Подскажите код, который бы искал все даты типа XX.XX.XXXX и заменял их чем-то
 
Имею textarea, куда вставляю некоторый HTML-код.

jQuery должен в этом тексте найти все фрагменты определенного формата, например, 30.07.2017, и заменить их на, скажем, <div class="vrotego">31.07.2017</div>

Как попросить jQuery найти все однотипные выражения, состоящие из двух цифр точки еще двух цифр точки и четырех цифр?

Спасибо.

рони 30.07.2017 22:20

Stenli,
reg = /\d{2}\.\d{2}\.\d{4}/g;
str = " 30.07.2017 30.07.2017"
str = str.replace(reg, '<div class="vrotego">$&</div>');
alert(str)

Stenli 30.07.2017 23:25

А если беда такая, что заменить нужно на

<?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?>

Я бы сразу так спросил, но совсем не мог подумать, что на выходе в другом textarea у меня вот это <? будет заменяться на вот это <!--?

рони 30.07.2017 23:50

Stenli,
не понимаю

Stenli 31.07.2017 00:02

^) что же я сегодня такой загадочный...

Давайте по-другому:

Мне нужно, чтобы все даты вида xx.xx.xxxx заменялись на
<?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?>

То есть все как в первом сообщении. Ваша подсказка работает, только в результате у меня меняется на
<!--?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?-->

Добавляются знаки закомментировывания <!-- -->
[IMG SRC=http://f6.s.qip.ru/~6wVwQIbF.png]

j0hnik 31.07.2017 00:12

Цитата:

Сообщение от Stenli (Сообщение 460133)
^)
Добавляются знаки закомментировывания <!-- -->
[IMG SRC=http://f6.s.qip.ru/~6wVwQIbF.png]

Это не рони, он не мог так с вами поступить. :no:

Stenli 31.07.2017 00:22

Безусловно. Грешу на свои пальцы из ушей и мозги из пяток.

Тыкал тыкал и понял, что такая подстанова происходит, когда jQuery видит комбинацию "<?". Он решает ее САМ заменить на "<!--?".

Если я знак вопроса первый уберу, то все ставится как надо, не меняется.

Как сделать, чтобы не появлялись знаки комментариев?

j0hnik 31.07.2017 00:43

Jquery тоже не в чем не виноват
<!DOCTYPE HTML>
<head>
</head>
<body>
<div>1<?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?></div>
<div>2&lt;?=date(&apos;+&apos;d.m.Y&apos;+&apos;, strtotime(&apos;+&apos;0 day&apos;+&apos;));?&gt;</div>
</body>
</html>

посмотрите код и результат, это браузер виноват!! мы с вами нашли виноватого!

Stenli 31.07.2017 03:26

Это очень и очень странно.

Потому что я пробовал подставить &lt; &gt; но браузер выдал их в таком же неизменном виде.

Кстати, как вы делаете кнопку "Просмотреть"? Чтобы код можно было сразу запустить из сообщения?

Вот, попробуйте с нижепоказанным кодом ввести любую дату формата ДД.ММ.ГГГГ. Получится на выходе
<!--?=date(d.m.Y, strtotime(0 day));?-->

Как победить, ума не приложу.
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="assets/css/bootstrap/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="assets/css/main.css">
    <script type="text/javascript" src="assets/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="assets/js/preland.js"></script>
    <title>Preland convert</title>
</head>

<body>



<div class="container">


    <div class="row">



            <div class="text-center" style="margin-top: 20px;">
                <button type="button" name="sendTo" value="Send to" id="sendTo" class="btn btn-success">Адаптировать</button>
            </div>
            <div class="text-center" style="font-size: 12px; margin: 10px;">Каждый новый текст требует обновления страницы (F5 на клавиатуре или кнопка обновить <span class="glyphicon glyphicon-repeat"></span>)</div>
            <hr />

            <div class="col-lg-12">
                <label>Введите html-текст, который нужно адаптировать (правая кнопка мыши + вставить или Ctrl+V)</label>
                <textarea class="form-control" name="insertArea" id="insertArea" cols="80" rows="10"></textarea>
            </div>





            <div class="col-lg-12" style="margin-top: 10px;">
                <label>Скопируйте/вырежьте адаптированный html-текст (правая кнопка мыши + копировать или Ctrl+C/X)</label>
                <textarea class="form-control" name="pastArea" id="pastArea" cols="80" rows="10"></textarea>
            </div>
            <br>



    </div>
</div>


</body>
</html>

$(document).ready(function() {

    var Final = '';

    $('#sendTo').on('click', function () {

        var insertData = $('#insertArea').val();
        var bodyVal = $("<body>", {html : insertData});
        var div = $("<div>", {html : insertData});

// replace dates
        var reg = /\d{2}\.\d{2}\.\d{4}/g;
        $(div).html(function (a,h) {
            return h.replace(reg, '<?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?>');
        });

// display result

        Final += "@include('layers.header') <body> " + div.html() + " @include('layers.footer')";
        $('#pastArea').val(Final);

    });

});

laimas 31.07.2017 04:12

j0hnik,
Stenli,
Вы что хрень несете, какие <?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?> могут быть на клиенте?

Stenli 31.07.2017 05:55

Ну, приехали... никто не говорит, что это на клиенте. Это должно быть в коде, который я прогоняю через textarea.

У меня есть несколько страниц, в каждой куча дат. Я их не хочу руками менять и не хочу к каждой странице подключать лишний скрипт. Лучше я сделаю свою форму, через которую буду прогонять HTML-код этих страниц, где вместо дат вставлять этот PHP-кусок.

А потом уже, когда клиент будет заходить на страницу, ему будет показана обновленная дата.

--

Короче говоря, к делу это не относится. Рони все правильно подсказал, как даты заменить на то, что мне нужно, но(!), теперь как сделать так, чтобы то, что мне нужно не оборачивалось комментариями?

laimas 31.07.2017 06:16

Цитата:

Сообщение от Stenli
Ну, приехали... никто не говорит, что это на клиенте. Это должно быть в коде, который я прогоняю через textarea.

Вы что хрень за несете? Это можно даже непосредственно в нормальном РНР/HTML редакторе сделать либо просто считать эти страницы серверным скриптом и посредством preg_replace/preg_replace_callback заменить. Вообще уже до того доходит, что просто слов нет.

Stenli 31.07.2017 06:30

Лаймас, вы на столько круче меня, что я не понимаю вас. Давайте остановимся на том, что мне надо так - смиритесь. Нет решения сделать по-моему или конструктивно объяснить вашу позицию - молчите.

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

laimas 31.07.2017 06:50

Stenli,
если вы спец в медицине, но не понимаете в программировании, тогда почитайте о том, как это делается по человечески. Для того, что изменить html на некоторых страницах, для этого нужно написать РНР код, это всего то три строки будет, что займет максимум 3 минуты, запустить его, что будет выполнено за секунду максимум, выбросить его и забыть.

Цитата:

Сообщение от Stenli
мне надо так - смиритесь

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

И не надо пугать, то же мне, блин, инквизитор в белом халате.

laimas 31.07.2017 07:01

Если будет маяться дальше, то примите к сведению, то для РНР

<?=date('d.m.Y', strtotime('0 day'));?> - галиматья полнейшая, это тоже самое, что и текущая дата date('d.m.Y'). А если к какой-то строке даты прибавлять, то полное отсутствие смысла.

Stenli 31.07.2017 07:03

Ну напишите, раз три строчки. Начнем хотя бы отталкиваться от этого. Что третий комментарий засерать флудом уже?

Stenli 31.07.2017 07:05

Цитата:

Сообщение от laimas (Сообщение 460160)
Если будет маяться дальше, то примите к сведению, то для РНР

<?=date('d.m.Y', strtotime('0 day'));?> - галиматья полнейшая, это тоже самое, что и текущая дата date('d.m.Y'). А если к какой-то строке даты прибавлять, то полное отсутствие смысла.

Что ж вы не понимаете то... этот кусок кода для примера. И суть не в этом. Я знаю что в таком виде это текущая дата. Суть в том, что добавляются комментарии.

Ну если удобно для понимания, давайте напишем так:
<?=date('d.m.Y', strtotime('-1 day'));?>

laimas 31.07.2017 07:14

Цитата:

Сообщение от Stenli
Ну если удобно для понимания, давайте напишем так:
<?=date('d.m.Y', strtotime('-1 day'));?>

Это да, но как параметр, а не то, что вы вытворять собираетесь. Хрен с ним, вы врач, а не программист, но это же не означает, что думать вы не можете, можете. Тогда вопрос - нахрена на клиенте помещать в код РНР вставки, которые потом преобразуют дату на сервере, причем делать это будут постоянно? Не логично ли это сделать один раз, откорректировав даты, что проще сделать сразу на сервере?

Stenli 31.07.2017 07:33

Для того, чтобы дата всегда была бы свежая, когда б ни зашел посетитель на сайт. Давайте забудем про то, как выводить дату.

Мой последний вопрос касался другого. Напомню: как сделать, чтобы не оборачивался код в комментарии.

laimas 31.07.2017 07:38

Цитата:

Сообщение от Stenli
Для того, чтобы дата всегда была бы свежая, когда б ни зашел посетитель на сайт.

А причем тут тогда клиент и выпендривание с заменой? Кошмар какой-то.

Nexus 31.07.2017 10:29

Цитата:

Сообщение от Stenli (Сообщение 460164)
как сделать, чтобы не оборачивался код в комментарии.

Попробовал затолкать в textarea php-код, код закомментирован браузером не был, комментирование произошло при попытке разместить код в теге «pre».
Опишите более детально, что вы пытаетесь сделать, вероятно есть более простое и правильное решение задачи.

Оборачивать даты в php-код на стороне клиента по меньшей мере смешно.
$string='Some 31.07.2017 date';
    echo preg_replace('#(\d{2}.\d{2}.\d{4})#uim','<div class="some-class">$1</div>',$string);
    exit;
    //Result: Some <div class="some-class">31.07.2017</div> date

laimas 31.07.2017 10:32

Цитата:

Сообщение от Nexus
Оборачивать даты в php-код на стороне клиента по меньшей мере смешно.

Это же самое справедливо и для серверной стороны, дату нужно получать и вставлять в шаблон как переменную.

Nexus 31.07.2017 10:57

laimas, я не понял сути задачи, которая стоит перед вопрощающим, однако, если задачей является обернуть все даты в тексте в тег, то извлекать все даты из строки, помещать их в переменные (массив), оборачивать их в тег, после вставлять в шаблон в виде переменной... ну это как-то глупо, что ли.
Я бы так точно делать не стал.

laimas 31.07.2017 11:04

Цитата:

Сообщение от Nexus
если задачей является обернуть все даты в тексте в тег, то извлекать все даты из строки, помещать их в переменные (массив), оборачивать их в тег, после вставлять в шаблон в виде переменной... ну это как-то глупо, что ли.

То есть парсить при каждом выводе текст это не глупо? Данному товарищу, насколько я понял, написали код, в котором он не в редакторе пытается нечто изменить, а посредством формы, отсюда и ноги проблемы.

Если также верить тому, что мне сказали, то исходный код полный бред, а всякие вставки посредством preg_replace для постоянной замены дат в тексте скорректированной текущей датой, еще более бредовый подход. Нужна оперативность замены, можно и в файле переменные прописать которые уже можно редактировать через форму. А в шаблон они должны подставляться обычным способом - вывод переменной.

Nexus 31.07.2017 11:19

Цитата:

Сообщение от laimas (Сообщение 460185)
а всякие вставки посредством preg_replace для постоянной замены дат в тексте скорректированной текущей датой, еще более бредовый подход.

Про корректировку даты в тексте я не писал, с цитируемым согласен полностью.
Если целью является постоянная "актуализация" даты, то да, тут правильным будет юзать переменные.

laimas 31.07.2017 11:29

Цитата:

Сообщение от Nexus
Про корректировку даты в тексте я не писал

Это в теме есть и мне так писали.

Stenli 31.07.2017 19:18

Цитата:

Сообщение от Nexus (Сообщение 460172)
Попробовал затолкать в textarea php-код, код закомментирован браузером не был...

Оборачивать даты в php-код на стороне клиента по меньшей мере смешно.

Попробую снова как-то с другой стороны зайти - пошагово описать. Только прошу вас очень: правильность обращения и вызова даты не комментируйте. Я понял ваше отношение - смешно, неправильно, хрень и т.д.

1. Я создал для себя страничку на локальном компе index.html - это моя страничка на моем компе и больше ею никто не пользуется - я клиент в этом случае для сервера и один единственный.
2. На этой страничке есть три (всего три) элемента: textarea с id="insertArea", textarea с id="pastArea", button с id="sendTo"
3. В textarea первое я вставляю HTML-код одностраничника со всеми тегами, переносами, списками , это понятно из названия id этого поля.
4. Нажимаю кнопку с id="sendTo", которая запускает jQuery.
5. jQuery обрабатывает текст, ищет выражения /\d{2}\.\d{2}\.\d{4}/g (даты) и заменяет их на <?= date('d.m.Y', strtotime('-3 day'));?>
6. Когда он заменит все даты в HTML-коде, он выгружает результат во второе textarea, у которого тоже говорящее id.
7. Я копирую измененный код из второго поля и вставляю его обратно в одностраничник.
8. Выгружаю одностраничник на сервер, где на него могут зайти все кто желает. Внутри одностраничника есть php-код, который обрабатывается сервером и выдает клиенту HTML-код с датой сдвинутой на -3.

Так вот, обработка jQuery, как вы говорите на стороне клиента нужна мне. Мне, Stenli, чтобы вставить php-код в HTML-код лендинга. Все остальные посетители не будут видеть этот php-код, они будут видеть дату.

Проблема возникает на 5-м пункте. Здесь почему-то то ли jQuery, то ли браузер добавляют комментарии к php-коду вида <!-- -->

Еще раз HTML:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="assets/css/bootstrap/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="assets/css/main.css">
    <script type="text/javascript" src="assets/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="assets/js/preland.js"></script>
    <title>Preland convert</title>
</head>

<body>



<div class="container">


    <div class="row">



            <div class="text-center" style="margin-top: 20px;">
                <button type="button" name="sendTo" value="Send to" id="sendTo" class="btn btn-success">Адаптировать</button>
            </div>
            <div class="text-center" style="font-size: 12px; margin: 10px;">Каждый новый текст требует обновления страницы (F5 на клавиатуре или кнопка обновить <span class="glyphicon glyphicon-repeat"></span>)</div>
            <hr />

            <div class="col-lg-8">
                <label>Введите html-текст, который нужно адаптировать (правая кнопка мыши + вставить или Ctrl+V)</label>
                <textarea class="form-control" name="insertArea" id="insertArea" cols="80" rows="10"></textarea>
            </div>


            <div class="col-lg-8" style="margin-top: 10px;">
                <label>Скопируйте/вырежьте адаптированный html-текст (правая кнопка мыши + копировать или Ctrl+C/X)</label>
                <textarea class="form-control" name="pastArea" id="pastArea" cols="80" rows="10"></textarea>
            </div>
            <br>



    </div>
</div>


</body>
</html>

И еще разок jQuery
$(document).ready(function() {

    var Final = '';

    $('#sendTo').on('click', function () {

        //var insertData = $('#insertArea').val();
        //
        var bodyVal = $('#insertArea').val();
        bodyVal = bodyVal.substring(bodyVal.indexOf('<body>')+6, bodyVal.lastIndexOf('</body>')).trim();
        var div = $("<div>", {html : bodyVal});

// replace dates
        var reg = /\d{2}\.\d{2}\.\d{4}/g;
        $(div).html(function (i,h) {
                return h.replace(reg, '<?=date(' + 'd.m.Y' + ', strtotime(' + '-3 day' + '));?>');
        });

// display result

        Final += div.html();
        $('#pastArea').val(Final);

    });

});


И да, спасибо за терпение, мужики. Да, Бог с ним, и laimas тоже спасибо.

Nexus 01.08.2017 11:11

Stenli, jQuery дважды подключается чтобы наверняка?)

$(document).ready(function() {

    var Final = '';

    $('#sendTo').on('click', function () {

        //var insertData = $('#insertArea').val();
        //
        var bodyVal = $('#insertArea').val();
        bodyVal = bodyVal.substring(bodyVal.indexOf('<body>')+6, bodyVal.lastIndexOf('</body>')).trim();
		
		// replace dates
        var reg = /\d{2}\.\d{2}\.\d{4}/g;
		bodyVal=bodyVal.replace(reg, '<?=date(' + 'd.m.Y' + ', strtotime(' + '-3 day' + '));?>');

		// display result

        Final += bodyVal;
        $('#pastArea').val(Final);

    });

});

Stenli 09.08.2017 03:13

Разрешите продолжить в рамках топика.

Я решил немного изменить схему добавления "чего-либо" вместо даты. Поэтому вместо '<?=date(' + 'd.m.Y' + ', strtotime(' + '-3 day' + '));?>', у меня будет добавляться '{{ $date_shift[v] }}'

Но не просто так. Хочу, чтобы с каждой следующей обнаруженной датой изменялось значение [v]. Причем по рандому оно должно либо не изменяться (да-да), либо изменяться на 1 (единичку).

Пока насоображал такую схему:

var reg = /\d{2}\.\d{2}\.\d{4}/g;
        var string = '{{ $date_shift[v] }}';
        var v=0;
        $(div).html(function (i,h) {
            for (var x=0 ; x <=i ; x++ ) {
                var randomShift = Math.random();
                if ( randomShift = 0 ) {
                    v = +1;
                }
                else {
                    v = +0;
                }
            return h.replace(reg, string);
            }
        });


Тупняк у меня наступил в момент, когда мне надо вставить новое значение [v] в переменную string. Ведь она передается как строка. Да и вообще я мог запросто намудрить ввиду своего начинающего уровня.

Подмозжите, чем можите... Спасибо.

Nexus 09.08.2017 09:14

Stenli,
if ( randomShift = 0 ) {
                    v = +1;
                }
                else {
                    v = +0;
                }

Во-первых, в строке 1 идет не сравнение переменной с числом, а присвоение значения этой самой переменной. Переменная станет равна нулю, а нуль всегда будет считаться за ложь (false).
Во-вторых, Math.random() возвращает случайно десятичное число от 0 до 1. Вероятность того, что рандом вернет нуль крайне и крайне мала (даже можно сказать, что она стремится к нулю).
В-третьих replace у вас должен выглядеть так:
h.replace(reg,'{{ $date_shift['+v+'] }}');


И вообще не понятно, что вы пытаетесь сделать, зачем все это?


Часовой пояс GMT +3, время: 12:31.