Написав сайт на Фреймворке CodeIgniter, я захотел разместить рекламу GoogleAdsense. В целом если размещать рекламу в начале и в конце статьи то проблем не возникает, вставляем код рекламы перед и после вывода переменной, содержащей оформленный текст статьи, и вуаля: все четко, реклама появилась. Но у меня тогда возник вопрос, а если у меня статья достаточно большая, то почему бы не вставить блок с рекламой в середину статьи. Применив все известный стандартный подход поиска информации – «шуршания» по интернету, нечего особого не нашел для CodeIgniter. Ну раз так, тогда давай мудрить.
Первое с чего мы начнем - это получим массив с материалом (статьей). Как правило, запрос делается в контроллере.
$data['main_info_reclama'] = $this->materials_model->get($material_id);
Затем передаем в созданную библиотеку массив с материалом.
$data['main_info'] = $this->reclama_lib->reclama($data['main_info_reclama']);
Ну, и наконец, создадим нашу библиотеку reclama_lib которая и будет определять место, соответствующее середине нашей статьи, и вычислять место для размещения кода рекламы. Суть работы данной библиотеки заключается в следующем: любая статья состоит из параграфов, списков, таблиц ну и т.д. без разницы. Мы будем считать сначала параграфы (теги <P>), а затем будем искать закрывающейся тег таблицы и/или списка (или др.), чтобы НЕ «влепить» нашу рекламу, например, в таблицу.
Использовать будем следующие функции:
- preg_match_all – Производит поиск по строке и не прерывает поиск после первого нахождения заданного элемента.
- preg_match – Производит поиск по строке и прерывает поиск после первого нахождения заданного элемента, т.е. мы не найдем все вхождения, а лишь только первое.
- substr_replace – Заменяет часть строки.
- Round - Округляем значение.
class Reclama_lib { protected $reclama_center = 'Здесь сгенерированный код Вашей рекламы'; protected $reclama_bottom = '<p style="text-align:center"> Здесь сгенерированный код Вашей рекламы </p>'; public function vstavka_v_kontse(&$array) { //Для вставки рекламы в конце //в конец строки конкатенируем переменную с кодом рекламы $array['main_text'] = $array['main_text'].$this->reclama_bottom; } public function reclama($reclama) { $CI = &get_instance(); $data['main_info'] = $reclama; // var_dump( $data['main_info']); //если массив пуст сразу выход из функции if(empty($data['main_info'])) { return $data['main_info']; } $matches_p = array(); //хранит результат работы функции preg_match_all. Работает по маске "/<p>/" $matches_ul = array(); //Работает по маске "/(<\/UL>)/i" $matches_table = array();//Работает по маске "/<table>/" $matches_p_bottom = array(); //теги P после середины $offset_m = 0; //задает смещение ноль в стоке $mean_tag = 0;//номер тега, который находится в середине (количество тегов делим на два) $teg_num = 6; //количество тегов, после которого ставить рекламу //$tags_count - получаем число тегов Р - открывающих $tags_count = preg_match_all("/<p>/",$data['main_info']['main_text'],$matches_p,PREG_OFFSET_CAPTURE,0); //echo $tags_count; //var_dump($matches_p); $mean_tag = round($tags_count/2);//номер тега, который находится в середине (количество тегов делим на два) //проверяем: пустая ли переменная if (!empty($tags_count)) { //Тегов меньше шести if($tags_count <= $teg_num) { //Для вставки рекламы в конце $this->vstavka_v_kontse($data['main_info']); } //тегов больше шести else { //ищу закрытый тег </table> $tags_count_table = preg_match("/(<\/table>)/i",$data['main_info']['main_text'],$matches_table,PREG_OFFSET_CAPTURE,$matches_p[0][$mean_tag-1][1]); //если закрывающий тег не найден if(empty($tags_count_table)) { //Вставка в середине материала не попавшая в таблицу $data['main_info']['main_text']= substr_replace($data['main_info']['main_text']," <br/>".$this->reclama_center." <p>",$matches_p[0][$mean_tag-1][1],3); //Вставка рекламы и в конце если деленное количество тегов /2 больше 6 if($mean_tag > $teg_num) { //вставка в конец материала $this->vstavka_v_kontse($data['main_info']); } } //Закрывающий тег таблице найден else { //считаем количество открывающих Р от позиции таблице $tags_count_p_bottom = preg_match_all("/<p>/",$data['main_info']['main_text'],$matches_p_bottom,PREG_OFFSET_CAPTURE,$matches_table[0][1]); if(empty($tags_count_p_bottom)) { $this->vstavka_v_kontse($data['main_info']); } else { //тегов после таблицы меньше шести if($tags_count_p_bottom < $teg_num) { //в конец строки вставляем рекламу $this->vstavka_v_kontse($data['main_info']); } //тегов после таблицы больше шести else { //Вставка рекламы в середине материала, не попавшая в таблицу $data['main_info']['main_text']= substr_replace($data['main_info']['main_text']," </table> <br/>".$this->reclama_center,$matches_table[0][1],8); $this->vstavka_v_kontse($data['main_info']); } } } } } return $data['main_info']; } }
Функция vstavka_v_kontse (&$array) Отрабатывает только тогда, когда в строке найдено меньше 6 тегов “P”, таким образом, понимаем что статья маленькая и ставим рекламу только в конце. Значение тегов можно изменять в переменной $teg_num = 6; //номер тега после которого ставить рекламу.
Можно так же, к примеру, всю статью заключать в тег <ul> </ul> и после этого в функции vstavka_v_kontse (&$array) искать последний тег </ul>
//Поиск всех закрывающихся тегов /UL, используя регулярные выражения "/(<\/UL>)/i". $tags_count_ul = preg_match_all("/(<\/UL>)/i",$data['main_info']['main_text'],$matches_ul,PREG_OFFSET_CAPTURE,0); //Заменяем часть строки, - подсовываем код с рекламой. $data['main_info']['main_text']= substr_replace($data['main_info']['main_text']," </ul> <br/>".$ reclama_center,$matches_ul[1][$tags_count_ul-1][1],5);
В основную функцию можно добавить и новые условия для других тегов, в которые не должна попадать реклама. Но в целом для решения моей задачи этого было достаточно.
На этом все, если у кого то есть свои идеи предлагайте возможно она интересней.
myindi38ru, 2021-11-18
# 87
сайт проституток