Deprecated: str_replace(): Passing null to parameter #1 ($search) of type array|string is deprecated in /var/www/jsd/data/www/jsd.ru/plugins/system/admintools/src/Feature/CustomAdminFolder.php on line 83
Разделение тела статьи на фрагменты по маркерам
Skip to main content

Разделение тела статьи на фрагменты по маркерам

Задача этого шага – передать соответствующим переменным нужные фрагменты тела статьи. А чтобы было что передавать, фрагменты нужно найти в теле статьи с помощью регулярного выражения, пример которого приведен ниже: ` |
(.*?)
|is` Маска регулярного выражения находится между вертикальными чертами `|`, чтобы исключить конфликт с элементами тега. Модификаторы (после маски выражения). - i - Регистронезависимый поиск (на само деле не очень нужен в примере). - s – Означает, что символ точка включает в себя переносы строк, т.е. поиск будет по всем строкам, а не по одной. Открывающий и закрывающий тэги разметки приведены в регулярном выражении в полном виде. Содержимое между тегов объединено в группу с помощью скобок и представляет из себя: - Точка – Соответствует любому единичному символу. - Звёздочка – После выражения, соответствующего единичному символу, соответствует нулю или более копий этого выражения. - Знак вопроса – Ленивый (не жадный) квантификатор, означающий в данном примере, что поиск будет производится до первого закрывающего тега `
`, а не до последнего. Если написал какую-нибудь фигню, то извините, в регулярных выражениях я не большой специалист, как и в программировании. В связке с PHP-кодом регулярное выражение будет выглядеть так: ``` if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$intro=$required_content[1];} ``` Поскольку функция `preg_match()` возвращает количество найденных строк (или false в случае ошибки), мы сразу помещаем её внутрь оператора-условия `if`. Таким образом, если поиск не дал результатов, то и вторая строка кода выполняться не будет. Функция `preg_match()` ищет соответствия шаблону регулярного выражения в переменной `$page_content ` и помещает результаты поиска в переменную `$required_content`. Массив с результатами поиска (в нашем случае `$required_content`) состоит из двух частей: в `$required_content[0]` будут найденные строки вместе с открывающим и закрывающим тегами div, а в `$ required_content [1]` будут те же строки без тега div, т.е. тот текст, что находится в круглых скобках регулярного выражения. (Так должно быть, но у меня если честно, в обеих переменных текст без тега div.) В случае, если с поиском всё тик-так, то сработает вторая строка кода, которая передаст переменной с уникальным (в рамках нашего кода) и понятным в контексте именем значение переменной `$ required_content [1]`, содержащей «чистые» результаты поиска. Полный код извлечения фрагментов рассчитан на 10 блоков и выглядит так: ``` (.*?)
|is', $page_content, $required_content)) {$intro=$required_content[1];} //if (isset($intro)) //{echo $intro;} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_01=$required_content[1];} //if (isset($heading_01)) //{echo $heading_01;} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_01=$required_content[1];} //if (isset($block_01)) //{echo $block_01;} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_02=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_02=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_03=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_03=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_04=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_04=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_05=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_05=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_06=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_06=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_07=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_07=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_08=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_08=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_09=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_09=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$heading_10=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$block_10=$required_content[1];} if (preg_match('|
(.*?)
|is', $page_content, $required_content)) {$conclusion=$required_content[1];} ?> ``` Понимаю, что код выглядит громоздко и, почти наверняка, его можно представить в более изящной форме, но я ничего лучшего придумать не смог. Если кто предложит хороший вариант - буду благодарен. Закомментированные фрагменты кода отвечают за вывод на экран содержимого переменных, в случае если оно есть, что сделано исключительно для отладки и проверки работы кода. Все закомментированные участки кода можно удалить. Приведенный выше код нужно обернуть в служебные теги плагина `{$ource}{/source}` и поместить в элемент конструктора Code, который должен следовать за элементом, описанным в предыдущим шаге инструкции. **Работа с элементом:** - Код (элемент) -> Ещё (вкладка) -> Имя (поле) -> Задаю элементу имя «Разделяем контент страницы на фрагменты по тегам-маркерам и присваиваем их переменным». Делается это исключительно для наглядности и чтобы не запутаться. - Код (элемент) -> Контент (вкладка) -> Контент (поле) -> Разместить код (сам код и условия размещения приведены выше).