Несколько полезных функций на PHP

Сегодня чисто техническая заметка о программировании. Привожу примеры своих функций, читаю ваши комментарии и предложения :)

Функция для обработки текста

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

// Обработка текста для сохранения в базу данных или отправки по почте
function ProcessText($text)
{
      $text = trim($text); // удаляем пробелы по бокам
      $text = stripslashes($text); // удаляем слэши
      $text = htmlspecialchars($text); // переводим HTML в текст
      $text = preg_replace("/ +/", " ", $text); // множественные пробелы заменяем на одинарные
      $text = preg_replace("/(\r\n){3,}/", "\r\n\r\n", $text); // убираем лишние переводы строк (больше 1 строки)
      $text = str_replace("\r\n", "<br>", $text); // заменяем переводы строк на тег

      return $text; //возвращаем переменную
}

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

...
$text = preg_replace("/^\"([^\"]+[^=><])\"/u", "«$0»", $text); // ставим людские кавычки, если в начале слова
$text = preg_replace("/([^=])\"([^\"]+[^=><])\"/u", "$1«$2»", $text); // ставим людские кавычки
$text = preg_replace("/(«){2,}/","«",$text); // убираем лишние левые кавычки (больше 1 кавычки)
$text = preg_replace("/(»){2,}/","»",$text); // убираем лишние правые кавычки (больше 1 кавычки)
...

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

...
$text = preg_replace("/(\r\n){2,}/u", "</p><p>", $text); // ставим абзацы
...

Функции для работы с файлами

Очень банально, но всё же удобно пользоваться такими функциями. Во первых, для увеличения уровня абстракции. Во-вторых, иногда разработчики забывают о функции file_put_contents.

// Извлечение контента файла
function Get($file)
{
      return file_get_contents($file);
}

// Сохранение контента в файл
function Save($file, $content)
{
      return (file_put_contents($file, stripslashes($content)));
}

Функция для отправки письма

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

// Отправка письма
// Входные данные: адрес получателя, адрес отправителя, тема письма, текст письма, имя отправителя

function SendEmail($toEmail, $fromEmail, $subject, $content, $from)
{
      // Обработка темы
      $subject = "=?utf-8?b?" . base64_encode($subject) . "?=";
      
      // Формирование заголовков
      $headers = "MIME-Version: 1.0\r\n";
      $headers .= "Content-type: text/html; charset=utf-8\r\n";
      $headers .= "From: =?utf-8?b?" . base64_encode($from) . "?= <" . $fromEmail . ">";

      return (mail($toEmail, $subject, $content, $headers));
}

Хотелось бы увидеть ваши комментарии и ваши любимые функции.

Тем временем в блогосфере

Алексей aka !eX.clusive написал небольшой кроссбраузерный скрипт для добавления страницы в закладки. Задача это всегда актуальна, так как браузеров много, и все они делают это по разному :)

Подпишитесь на обновления блога

Получить в подарок мини-книги и 21-дневный тренинг по личностному росту.

Подписаться на рассылку «Инструменты Интернет для онлайн бизнеса»

Поделиться ссылкой:


Комментарии:

18.10.2010 16:11:03
#1 ванёк

$text = str_replace(« », «<br>», $text); // заменяем переводы строк на тег

а могли ведь просто написать $test = nl2br ($text); // php.net/nl2br

могли бы и выучить основные функции ;)

18.10.2010 16:17:16

Достаточно интересные и полезные функции. Есть на примете свои подобные, но понял, что упустил некоторые нюансы :)

18.10.2010 16:17:31

ванёк, верстаю в HTML, а nl2br вставляет <br /> со слэшем. Не люблю я её.

18.10.2010 16:18:42
#4 Aidem

Привет! Поясни пжлста зачем кодируешь имя отправителя?

18.10.2010 16:20:21

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

18.10.2010 17:50:28

Тег <br /> более современный. Хотя, если данные из формы пишутся в базу напрямую, то лучше не заменять перенос на него, чтобы не засирать базу. Легче его поставить при выводе из базы.

18.10.2010 17:53:14

eX.clusive, вроде бы и так, но я не люблю xHTML. Когда переносы ставить - это тоже дело вкуса.

18.10.2010 18:10:32

Не понял, зачем нужны дополнительные обёртки для file_get_contents и *put* :) Тем более, ты забыл о том, что в file_get_contents, например, можно передавать контекст. К примеру, таймаут, если ты запрашиваешь информацию с какого-то URI.

Вот, кстати, моя функция для этого случая - http://pastie.org/1230495
И тут обёртка создаёт дополнительные удобства, а вот какие удобства у твоих Get и Save, я не понял.

18.10.2010 18:13:57

Тормоз, это самая простая функция. В том-то и дело, что пока мне ничего сложней не нужно. Но если понадобится, то просто перепишу функцию, а не буду менять в десятке мест.

За функцию спасибо!

18.10.2010 18:50:40

И всё же интересно, что например в этом контексте может понадобиться? :)

18.10.2010 18:52:35

Тормоз, говорю же, увеличение уровня абстракции. И приятные имена функций, например :)

18.10.2010 19:09:11

Сдаётся мне, ты под уровнем абстракции понимаешь что-то своё :)
А имена функций у file_get_contents и file_put_contents более приятны, IMHO, они отражают суть, а у тебя гадай, чего там Get, чего Save. Если тебе приятней их набирать, то в нормальном редакторе есть автодополнение, поэтому имя функции из 20 знаков набрать также легко, как имя функции из 5 знаков - парой клавиш.

P.S. Перематерился весь. А оказалось, причина моего раздражения - ты. Кажется.
Признайся, повесил обработчики на Ctrl+стрелки? Ужас.

18.10.2010 19:16:39

Тормоз, возможно своё. Я же тоже самоучка и многого не знаю. Но если мне так удобней, то почему бы нет :)

Да, обработка контрол+стрелки была. Убрал таки нафиг.

18.10.2010 19:38:15

Спасибо, полезные, а главные действительно нужные функции. Пошел пилить парсер =)

18.10.2010 19:59:03

Во, теперь по тексту в форме перемещаться нормально можно! :)
Спасиб. А зачем эти Ctrl+стрелки были, вообще?

P.S. Все интернет-предприниматели и 90% разработчиков в большей степени самоучки. Потому что эта сфера развивается очень быстро, некому обучать - не учат этому в университетах. Не считая программирования, наверно, но и там полно старпёров, которые кроме академических примеров кода ничего не видели.

18.10.2010 20:25:17

Тормоз, когда делал блог, ужасно пёрся по этому эффекту. Это казалось мне магией :) Совершенно не знал JavaScript тогда.

seozip, кстати о парсерах :) Напишу пожалуй статейку про ультра-простое решение получения всевозможных валютных курсов по отношению к гривне :)

19.10.2010 02:47:34
#18 gala

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

19.10.2010 07:04:40

Тормоз, спасибо за ссылочку. Я бы сказал, что мой метод интересней. Во-первых, он взаимодействует с украинским сайтом, а значит точнее. Во-вторых, на выходе получаем массив данных гривны со всевозможными валютами, причём не только курс НБУ, а ещё и курсы средней покупки и продажи наличных . В-третьих, я сам его придумал :)

gala, забавный вопрос. Реализовать можно совершенно по разному. Напишите зачем вам этот скрипт лучше.

19.10.2010 08:35:06
#20 gala

Never Lex, на html страничке есть кнопка - распечатать купон, хочется сделать надпись «скидку получили хх человек» вот страничка http://mebelrio.ru/kupon.html

19.10.2010 08:47:02

gala, имхо самое простое решение в данном случае - использовать Google Analytics.

19.10.2010 09:32:27

gala,

Черканите на lex15[собака]inbox.ru - вечерком приду домой и напишу пару вариантов.

Never Lex
Про то, когда ставить переносы - это дело не вкуса, а перспектив использования. Да и вообще - в базу всегда удобней вносить оригинальный вид сообщения (разве что от sql-injections защитить), а при выводе уже форматировать как надо - т.к. тогда в будущем всегда вывод можно поправить (например, разррешить или запретить bb-теги и др). Я просто прошел через эту проблему уже и научен горьким опытом...
Но, опять же, это только при записи куда либо, а для уроков - и как есть сойдёт )

19.10.2010 12:12:44
#23 gala

Ex.clusive, проверьте почту , заранее спасибо.

19.10.2010 12:45:53

Ex.clusive, и мне напиши способы, интересно. Но имхо в данном случае правильней использовать Анатиликс. Заметь, что кнопка просто жаваскриптовая. Страничку незачем перегружать, то есть, надо использовать AJAX (чтобы данные где-то хранить). Хотя в принципе это не так уж и сложно.

20.10.2010 06:56:54

Тормоз, кстати по поводу уровня абстракции. Дело в том, что я стараюсь не совершать операций в контроллере. Все операции вынесены в модули. Например, функция чтения из файла вызывается строкой $mForms->Get('адрес файла');

23.10.2010 15:48:01

Внесу в копилку свою функцию - уменьшает размер html файла удалением лишних пробелов, переносов строк, комментариев. Делает неудобным визуальное восприятие html тегов.

function htmlCompress($html){
//return $html;
preg_match_all(’!(<(?:code|pre|textarea|script)[^>]+>.*?</(?:code|pre|textarea|script)>)!si’,$html,$pre);
$html = preg_replace(’!<(?:code|pre|textarea|script)[^>]+>.*?</(?:code|pre|textarea|script)>!si’, ’#pre#’, $html);
// preg_match_all(’!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!’,$html,$pre);
//$html = preg_replace(’!<(?:code|pre).*>[^<]+</(?:code|pre)>!’, ’#pre#’, $html);
$html = preg_replace(’#<!–[^[].+–>#’, ’’, $html);
$html = preg_replace(’/[ ]+/’, ’ ’, $html);
$html = preg_replace(’/>[s]+</’, ’><’, $html);
$html = preg_replace(’/[s]+/’, ’ ’, $html);
if (!empty($pre[0])) {
foreach ($pre[0] as $tag) {
$html = preg_replace(’!#pre#!’, $tag, $html,1);
}
}
return $html;
}

23.10.2010 23:22:41

Дмитрий, ну и нафиг это нужно?

24.10.2010 14:04:04

$text = str_replace(« », «<br>», $text);

можно заменить на

$text = nl2br($text);

Про обертки тоже не понял, нафига?

24.10.2010 19:38:32

Alex Pro, о переносе строк я уже отвечал.

Про какие обёртки спрашиваешь???

27.10.2010 10:55:57

Сортировка ассоциативных массивов по значению поля внутреннего массива (условно говоря {0=>{’key’=>2, 2, 3}, 1=>{’key’=>5, 3, 2} }). Кусок старый, без сортировки по ключам.

<?

class ArrayOperations{

//сингльтон
function &instance(){
static $instance;
if (!is_object($instance))
$instance = new ArrayOperations();
return $instance;
}

//сортировка
function sort($array, $sort, $deprecated = ’ASC’){
if(!is_array($sort)){
$sortby=$sort;
$sort=$deprecated;
}
else{
$sortby = key($sort);
$sort = current($sort);
}
$sort=strtolower($sort);
if($sort!=’asc’)
$sort=’desc’;

$func = $sortby.’_’.$sort;
usort($array, array($this , $func));

return $array;
}

function __call($name, $args){
//сами сортировки
if(preg_match(’~^(.+?)_desc$~’, $name, $match)){
$name=$match[1];
if ($args[0][$name] == $args[1][$name]) {
return 0;
}
return ($args[0][$name] < $args[1][$name]) ? 1 : -1;
}
elseif(preg_match(’~^(.+?)_asc$~’, $name, $match)){
$name=$match[1];
if ($args[0][$name] == $args[1][$name]) {
return 0;
}
return ($args[0][$name] < $args[1][$name]) ? -1 : 1;
}
}

}

?>

Там, где лень писать сотню допфункций для usort.

Используется ArrayOperations::instance()->sort($array, array(’key’ => ’ASC’)); (можно и от сингльтона избавиться, но в моем случае нужен был, чтобы хранить)

29.10.2010 11:24:17

Воо, то что надо. Как раз активно сейчас постигаю скрипты на хуман эмуляторе и php, забрал себе пару примеров.

02.11.2010 14:46:41
#32 Алексей

Про обертки не понял. Объясните, кто-нибудь?

07.11.2010 14:51:49

Тормоз, Размер html файла сокращается % на 10. Такую технологию использует Яндекс.
Можно еще конечный файл в gzip отдавать. Тогда размер файла сократится в разы.

07.11.2010 15:06:32

Gzip - нормальный правильный метод, а вот коверкать HTML ради 10% сокращения размеров глупо.

09.11.2010 17:04:33

Ура! Наконецто нашел!
$text = htmlspecialchars($text); искал минут 20! Спасибо!

18.01.2011 12:32:25
#36 Антонио

Функция function ProcessText($text) мечта парсера

18.03.2011 20:55:44
#37 karanic

Про обертки так же не ясно. Можно подробнее?

07.06.2011 21:15:39

Спасибо.
Функции простые и понятные.
Первую функцию возьму на заметку - давно было необходимо написать нечто подобное.

Ну, и что бы как-то поддержать и оживить тему, выложу одну свою функцию. Она далеко не идеальна, но т. к. я испытываю некоторую и любовь и ненависть (ненависть больше) к регуляркам, времени некогда я потратил на неё достаточно.
Функция возвращает текст с заменёнными bb-кодами на html-код.

function bb ($text)
{
$regex[] = ’|[b]([sS]*?)[/b]|im’;
$regex[] = ’|[i]([sS]*?)[/i]|im’;
$regex[] = ’{[url=javascript:(.*)](([sS])*S+)[/url]}i’;
$regex[] = ’{[url=([^!’«{}();s]+?)]([sS]*?)[/url]}i’;
$regex[] = ’{[url]([^!’»{}();s]+?)[/url]}i’;
$regex[] = ’{^(http://[^s]{3,})+?$}i’;
$regex[] = ’{(s)+(http://[^s]{3,})+?$}i’;
$regex[] = ’{^(http://[^s]{3,})+?(s)+}i’;
$regex[] = ’{(s)+(http://[^s]{3,})+?(s)+}i’;
$regex[] = ’{[img=([^!’"{}();s]+?)]}i’;
$regex[] = ’|[color=#([wd]{6}?)]([sS]*?)[/color]|im’;
$regex[] = ’|[size=(d){1,2}?]([sS]*?)[/size]|im’;

$replacement[] = ’<b>$1</b>’;
$replacement[] = ’<i>$1</i>’;
$replacement[] = ’<br /><b>Я уебан!</b><br />’;
$replacement[] = ’<noindex><a href="$1" rel="nofollow">$2</a></noindex>’;
$replacement[] = ’<noindex><a href="$1" rel="nofollow">$1</a></noindex>’;
$replacement[] = ’<noindex><a href="$1" rel="nofollow">$1</a></noindex>’;
$replacement[] = ’$1<noindex><a href="$2" rel="nofollow">$2</a></noindex>’;
$replacement[] = ’<noindex><a href="$1" rel="nofollow">$1</a></noindex>$2’;
$replacement[] = ’$1<noindex><a href="$2" rel="nofollow">$2</a></noindex>$3’;
$replacement[] = ’<div class="imgHover"><img class="imgAttach" onclick="return zoomImg(this)" src="$1"/></div>’;
$replacement[] = ’<font color="$1">$2</font>’;
$replacement[] = ’<font size="$1">$2</font>’;

$rez = preg_replace ($regex, $replacement, $text);
return $rez;
}

07.06.2011 21:22:13

Упс, просьба изменить 18-ую строку кода на что-либо более корректное))
Дело в том, что этот текст - то, на что заменяется попытка js-инъекции. Например, когда юзер вставит в текст ссылки текст, начинающийся с превдопротокола javascript...

14.08.2011 10:02:43

Интересные функции.обязательно попробую . спасибо..

16.04.2012 14:50:02

Если кому интересно, есть несколько полезных функций на http://netcoding.ru/articles/php/polezniye-php-funcii/

Оставьте комментарий [форматирование]

Пожалуйста, воздержитесь от спама и идиотских высказываний. Жёсткая модерация. Ссылки закрыты атрибутом nofollow, а значит не несут пользы для продвижения!
Ссылки на всё кроме личных блогов и тематических блогов, сходных по тематике с данным, вырезаются.



Мой Telegram канал
Мой RSS фид