Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2021, 09:44   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Парсинг и замена слова в тексте

Я хочу сделать функционал, который в моем php файле находит html-элемент по id и изменяет в нем текст.

Код:
 
        $string = $web;
        $pattern = "/(<a style='color: #525050' id = 'insertAffiliation' class = 'lk_field'>).*?(</a>)/";
        $replacement = '${1} 1 ${3}';
        
        $html_string = preg_replace($pattern, $replacement, $string);
Элемент находится с id insertAffiliation, но в нем нужно изменить то, что в коде я понимаю как .*?
Например, это может выглядеть так:

Код:
<a style='color: #525050' id = 'insertAffiliation' class = 'lk_field'>Старый текст</a>
А мне нужно заменить это в тексте на
Код:
<a style='color: #525050' id = 'insertAffiliation' class = 'lk_field'>Новый текст</a>
Помогите сообразить, что за ошибка в коде выше и как это, все таки, сделать?
Krasi вне форума Ответить с цитированием
Старый 26.05.2021, 16:41   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

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

Что в переменной $web ?

Цитата:
что за ошибка
какую ошибку выдаёт?

Пока никакого кода замены и не заметно.
Alar вне форума Ответить с цитированием
Старый 01.06.2021, 12:18   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Окей, какая тут задача... Я сгенерировал одностраничный сайт, и мне на нем нужно что-то изменить. Я нажал на изменить, и у меня сработал JS-код, который встроен на этот сайт. Допустим, были "Общие положения", стали "Основные положения". Скрипт меняет "Редактировать" на "Сохранить" и наоборот, а с помощью AJAX-запроса передает данные на php-скрипт.

1111.jpg

Я ради концепции решил не работать с базой данных при генерации файлов, то есть они все находятся физически на диске в той директории, в которой нужно. Поэтому дальше мне надо открыть файл, в котором JS-изменил название одного из заголовков, пройтись по этому файлу и заменить html-элемент. Вот, сам элемент показан в первом посте. И я имею в $web содержимое файла, а также у меня есть информация, что на что заменить. То есть я имею $pattern, в нем делаю замену $replacement = '${1} 1 ${3}'; Пока поставил 1-ку для простоты, дескать хоть на что-то поменять. Ошибку не выдает сейчас, но замены не происходит. Что делаю не так тогда, и как нужно?

Последний раз редактировалось Krasi; 01.06.2021 в 12:22.
Krasi вне форума Ответить с цитированием
Старый 01.06.2021, 12:24   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

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

Я пока не могу сообразить кто вам на сервере разрешит ява скрипту менять файлы.

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

Что-то на сервере делать - это вам к PHP

можно попробовать наделать файликов Include, и их подгружать, их менять с помощью PHP возможностей, тогда и Replase не нужен файл можно пересоздавать.

Общие положения", стали "Основные положения" например в файле OSN.inc

"Редактировать" на "Сохранить" в файле Button.inc

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

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

вообщем это называеется функциональное программирование, по сути вы запрашиваете в данном случае функцией - кусок текста или кода без входящих исходящих переменных.
Alar вне форума Ответить с цитированием
Старый 01.06.2021, 19:45   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Не, все на php происходит, я туда просто ajaxом посылаю переменные. Пока вообще можно абстрагироваться, что у меня есть php-скрипт, он открывает файл, производит замену в нем и закрывает его, сохранив изменения.
То есть мне нужен код, как на php открыть файл, найти в нем html-элемент по id, произвести замену его свойства и потом переписать файл с помощью file_put_content(). Пытаюсь понять, как это правильно сделать?

Последний раз редактировалось Krasi; 01.06.2021 в 19:50.
Krasi вне форума Ответить с цитированием
Старый 01.06.2021, 23:27   #6
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

чтобы этого не делать я предложил каждую переменную положить в ,inc файл и подгружать их через include php функцию

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

Код:
<? include("blok.inc") ?>
Цитата:
как это правильно сделать?
Сделать глобальными переменными любые меняемые названия.

https://www.php.net/manual/ru/langua...bles.scope.php
Alar вне форума Ответить с цитированием
Старый 03.06.2021, 18:12   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
можно попробовать наделать файликов Include, и их подгружать, их менять с помощью PHP возможностей, тогда и Replase не нужен файл можно пересоздавать.

Общие положения", стали "Основные положения" нап
Предложение хорошее, но пока мне нужен именно поиск по файлу. То есть делать через инклуды не вариант, там долго рассказывать. продукт относительно сложный. Мне надо понять, что я делаю не так, что в php-файле, который я открываю не заменяется значение. Точнее, оно не заменяется после самой функции поиска и подмены (регулярки).
Krasi вне форума Ответить с цитированием
Старый 03.06.2021, 18:22   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

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

Код:
<?php 
    $user_property = stripslashes(trim(htmlspecialchars($_POST['user_property'],ENT_QUOTES)));
    $insert_element = stripslashes(trim(htmlspecialchars($_POST['insert_element'],ENT_QUOTES)));
    $page = stripslashes(trim(htmlspecialchars($_POST['page'],ENT_QUOTES)));
    if($user_property != ''){
        $web = file_get_contents('page/page'.$page.'.php');
        
        $searchfor = $insert_element;
        header('Content-Type: text/plain');
        $contents = $web;
          // позволяет избежать специальных символов в массиве
        $pattern = preg_quote($searchfor, '/');
          // завершение регулярного выражения, совпадающего всему предложению
        $pattern = "/^.*$pattern.*$/m";
          // поиск и добавление в массив $matches всех совпадений 
      if(preg_match_all($pattern, $contents, $matches)){
         echo "Найденные совпадения: ";
         echo implode(" ", $matches[0]);
         }
      else {
         echo "Совпадений не найдено";
           }
      
        $string = $web;
        $pattern = "/(<a style='color: #525050' id = 'insertAffiliation' class = 'lk_field'>).*?(</a>)/";
        $replacement = '${1} 1 ${3}';
        
        $html_string = preg_replace($pattern, $replacement, $string);
        //$html_string = preg_replace( , "sdfsdfsdf" );
        //html_string = html_string.replace( /(<h3 id='title'>).*?(</h3>)/, "$1New Text$2" );
        
        $doho = file_put_contents('chel.txt', $web);
        
        
        //$query = mysqli_query($link, "UPDATE users SET $db_field_name='".$user_property."' WHERE user_id='".$user_id."'");
    }
    
?>
В файл подставлял $web - отображается страница, которая в php-файле находится. А в $html_string - пустота, хотя я хочу там увидеть ту же html-страницу, но с подменой слова внутри указанного html-тега.
Krasi вне форума Ответить с цитированием
Старый 03.06.2021, 18:44   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Разобрался. Вот решение.
Код:
<?php 
    $user_property = stripslashes(trim(htmlspecialchars($_POST['user_property'],ENT_QUOTES)));
    $insert_element = stripslashes(trim(htmlspecialchars($_POST['insert_element'],ENT_QUOTES)));
    $page = stripslashes(trim(htmlspecialchars($_POST['page'],ENT_QUOTES)));
    if($user_property != ''){
        $web = file_get_contents('page/page'.$page.'.php');
        
        $searchfor = $insert_element;
        header('Content-Type: text/plain');
        $contents = $web;
          // позволяет избежать специальных символов в массиве
        $pattern = preg_quote($searchfor, '/');
          // завершение регулярного выражения, совпадающего всему предложению
        $pattern = "/^.*$pattern.*$/m";
          // поиск и добавление в массив $matches всех совпадений 
      if(preg_match_all($pattern, $contents, $matches)){
         echo "Найденные совпадения: ";
         echo implode(" ", $matches[0]);
         }
      else {
         echo "Совпадений не найдено";
           }

        $new_text = preg_replace("|(<a style='color: #525050' id = 'insertAffiliation' class = 'lk_field'>).*(</a>)|Uis", '$1три$2', $web);

        $doho = file_put_contents('chel.txt', $new_text);
    }
    
?>
Krasi вне форума Ответить с цитированием
Старый 04.06.2021, 10:30   #10
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

Хорошо что код опубликовал, может пригодится кому.
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена определённых слов в тексте на слова из словаря Enmaboya C# (си шарп) 0 21.01.2018 16:26
Замена в тексте. Артём_2 C++ Builder 1 18.10.2016 14:13
Дан текст. Слова в тексте отделены одним пробелом, в конце текста точка. Распечатать все слова текста, которые содержат..... Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 1 06.02.2012 23:36
замена символов в тексте majikku Общие вопросы Delphi 1 31.01.2011 00:13
Замена символов в тексте Pasha_Sh Работа с сетью в Delphi 13 16.06.2010 00:29