1. Как можно в строке урезать слова до определенной длины и потом урезать саму строку до определенной длины.
Задача, сократить длину слов в строке $string если длина слова превышает $chars_max символов, до значения $chars_max и завершить сокращенные слова точкой. Слово может состоять из любого не пробельного символа. Это нужно в случаях, например, если используются анонсы в колонках постоянной и не большой ширины. Часто бывает, что в комментариях, пользователи забывают поставить пробелы между словами, разделяя слова лишь знаками препинания или пишут адрес страницы, который может достигать большого числа символов, или просто слово слишком длинное.
Приводим функцию, которая чистит саму строку о плохих символов, затем делит её, даже на те знаки препинания, которые пользователи оставили в ней, выводит лишь слова, затем урезает слова до определенной длины, а потом и саму строку до определенной длины.
<?php
# такая строка
$stroka = "Люди ничего не забывают.Но они
часто смелые,глупые и хитрые.
Для чего им:нужен мозг.";
# максимальная длина слов
$chars_max = 5;
# максимальная длина всей строки
$chars_max_string = 47;
# сама функция
function _Max_long_string ($string){
global $chars_max, $chars_max_string;
$string = preg_replace ("/[ˆ\n\x20-\xFF]/", "", $string);
$string = preg_replace ( "~"|“|”|«|»|&#(1(47|48|71|87)|34)[;]?~s", '"', $string );
$string = preg_replace ( "~‘|’|&#(1(45|46)|39)[;]?~s", "'", $string );
$string = preg_replace ( "~–|—|(50|51)[;]?~s", "-", $string );
$string = preg_replace ( "~…|…[;]?~s", "...", $string );
$word = split ("[\n., :]", $string);
$lines = sizeof ($word);
for ($i = 0; $i < $lines; $i++){
if ( ! empty ($word[$i])){
if ( strlen ($word[$i]) > $chars_max ) { $array[] = substr ( $word[$i] , 0 , $chars_max ) . "."; }
else { $array[] = $word[$i]; }
}
}
$lines = sizeof ($array);
$string = '';
for ($i = 0; $i < $lines; $i++) { $string .= $array[$i]." "; }
$string = trim ( preg_replace ("~[ ]+~", " ", $string));
$string = trim ( substr ( $string , 0 , $chars_max_string-1 ) );
if ( preg_match ("~\.$~",$string)) return $string;
return substr ( $string , 0 , $chars_max_string-1 ) . ".";
}
$new_stroka = _Max_long_string ($stroka);
print $new_stroka;
# получим на выходе
# Люди ничег. не забыв. Но они часто смелы. глуп.
?>
2. Как привести различные форматы вывода даты в удобочитаемый текст
Даты типа:
Fri, 23 Mar 2012 11:06:53 +0000
2012-03-26T13:09:14.303+04:00
Tue, 27 Mar 2012 00:30:04 +04:00
12/Mar/2012:15:02:29 +0600
<?php
function My_year ($str){
$arr = array ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
for ($i=0; $i<12; $i++){
if ($str==$arr[$i]){ $key = $i+1; break; }
else $key = '';
}
if (! empty ($key)){
if (strlen($key==1)) return '0'.$key;
else return $key;
}
return 12;
}
function My_date_convert ($str){
$arr_week = array ('Mon' => 'Понедельник', 'Tue' => 'Вторник', 'Wed' => 'Среда', 'Thu' => 'Четверг', 'Fri' => 'Пятница', 'Sat' => 'Суббота', 'Sun' => 'Воскресенье');
$arr_month = array ('Jan' => 'Января', 'Feb' => 'Февраля', 'Mar' => 'Марта', 'Apr' => 'Апреля', 'May' => 'Мая', 'Jun' => 'Июня', 'Jul' => 'Июля', 'Aug' => 'Августа', 'Sep' => 'Сентября', 'Oct' => 'Октября', 'Nov' => 'Ноября', 'Dec' => 'Декабря');
if ( preg_match ("~([0-9]{4})-([0-9]{2})-([0-9]{2})~", $str, $array) ){
$year = $array[1];
$month = $array[2];
$day = $array[3];
}
elseif ( preg_match ("~([0-9]{2}) ([a-zA-Z]{3}) ([0-9]{4})~", $str, $array) ){
$day = $array[1];
$month = My_year ($array[2]);
$year = $array[3];
}
elseif ( preg_match ("~([0-9]{4}) ([a-zA-Z]{3}) ([0-9]{2})~", $str, $array) ){
$year = $array[1];
$month = My_year ($array[2]);
$day = $array[3];
}
elseif ( preg_match ("~([0-9]{2})\/([a-zA-Z]{3})\/([0-9]{4})~", $str, $array) ){
$day = $array[1];
$month = My_year ($array[2]);
$year = $array[3];
}
else { return "Error"; }
$time = @mktime (0,0,0,$month,$day,$year);
$key_day = @date ('D', $time);
$key_month = @date ('M', $time);
# Вторник 27 Марта 2012
$out = $arr_week[$key_day]." ";
$out .= $day." ";
$out .= $arr_month[$key_month]." ";
$out .= $year;
return $out;
}
$string = 'Fri, 23 Mar 2012 11:06:53 +0000';
print My_date_convert ($string);
print "<br>\n";
$string = 'Tue, 27 Mar 2012 00:30:04 +04:00';
print My_date_convert ($string);
print "<br>\n";
$string = '2012-03-26T13:09:14.303+04:00';
print My_date_convert ($string);
print "<br>\n";
$string = '12/Mar/2012:15:02:29 +0600';
print My_date_convert ($string);
?>
2. Проверка правильности введения имени в форму. Надо, чтобы были допустимы русские, английские буквы пробел и знак подчеркивания, если вдруг встречается другой знак, то выводим ошибку.
<?php
function vlogin ($login) {
$login = trim ( preg_replace ("/[ˆ\x20-\xFF]/", "", @strval ($login)) );
if ( strlen ($login) == 0 ){ return 'error'; }
if ( preg_match ("/[ˆa-zA-Zа-яА-Я0-9_ ]/", $login) ) { return 'error'; }
return $login;
}
$login1 = "Alex 777 опа"; # - правильно
$LOG = vlogin ($login1);
if ($LOG != 'error'){ print "Логин <b>".$login1."</b> введен правильно"; }
else { print "НЕ правильно, ошибка..."; }
print "<br><br>\n";
$login2 = "hi / my name \ is ! Oleg"; # - неправильно
$LOG = vlogin ($login2);
if ($LOG != 'error'){ print "Логин <b>".$login2."</b> введен правильно"; }
else { print "НЕ правильно, ошибка..."; }
?>
Здесь допустимы:
a-zA-Z английские буквы, все
а-яА-Я русские буквы, все
0-9 все цифры
_ зак подчеркивания
\ и пробел
3. Проверка правильности введение Емайл пользователем.
<?php
function vm($path) {
$path = trim ( preg_replace ("/[ˆ\x20-\xFF]/", "", @strval ($path)) );
if ( strlen ($path)=='0'){ return 'error'; }
$array = explode ( "@", $path );
if ( preg_match ( "/[_\.-]{2}/", $array[0] ) ){ return 'error'; }
if ( preg_match ( "/[_\.-]{1}$/", $array[0]) ){ return 'error'; }
if ( !preg_match ("/ˆ[a-z0-9_\.-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$path)){ return 'error'; }
return $path;
}
$mail = "example@mail.ru"; # - правильно
$EM = vm ($mail);
if ($EM != 'error'){ print "Емайл <b>".$mail."</b> введен правильно";}
else { print "Ошибка введения..."; }
print "<br><br>\n";
$mail = "exam..ple@mail.ru"; # - НЕ правильно
$EM = vm ($mail);
if ($EM != 'error'){ print "Емайл <b>".$mail."</b> введен правильно";}
else { print "Ошибка введения..."; }
?>
4. Проверка URL сайта
<?php
function vurl($path) {
$path = trim ( preg_replace ("/[ˆ\x20-\xFF]/", "", @strval ($path)) );
if ( strlen ($path)=='0') {return 'error'; }
if ( !preg_match ("~ˆ(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
"!0[ˆ.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[ˆ '\"&<>]*)?$~i",$path,$ok)) { return 'error'; }
if ( !strstr( $path,"://")) $path="http://".$path;
$path = preg_replace ("~ˆ[a-z]+~ie"," strtolower ('\\0')", $path);
return $path;
}
$url = "http://example.ru"; # - правильно
$VURL = vurl ($url);
if ($VURL != 'error'){ print "Url <b>".$url."</b> введен правильно";}
else { print "Ошибка введения..."; }
print "<br><br>\n";
$url = "http://e..xample.ru"; # - НЕ правильно
$VURL = vurl ($url);
if ($VURL != 'error'){ print "Url <b>".$url."</b> введен правильно";}
else { print "Ошибка введения..."; }
?>
5. Нахождение ссылок на странице .html
<?php
function vlinks ($page){
$page = @implode ( '', @file ($page));
if (! preg_match_all ("/<[Aa][ \r\n\t]{1}[ˆ>]*[Hh][Rr][Ee][Ff][ˆ=]*=".
"[ '\"\n\r\t]*([ˆ \"'>\r\n\t#]+)[ˆ>]*>/",$page,$url_list))
{ return error; }
$link = array ();
foreach ($url_list as $url_temp){
foreach ($url_temp as $urla){
if ( !preg_match ("~href~i",$urla)
and !preg_match ("~javascript~i",$urla)
and !preg_match ("~mailto~i",$urla)
and !preg_match ("~#~i",$urla)){
$link[] = $urla;
}
}
}
return $link;
}
// index.htm - страничка с которой считываем ссылки
$links = vlinks ("index.htm");
// выводим ссылки на печать
if ($links != 'error'){
while ( list ($key, $val) = @each ($links)){
print "$key. <a href=$val> $val </a> <br>\n";
}
}
?>
Нашли все ссылки html на страничке.
6. Заменить все Большие буквы на маленькие.
<?php
function ruLow ($string){
$string = trim ( preg_replace ("/[ˆ\x20-\xFF]/", "", @strval ($string)));
if ( strlen ($string) == 0 ) { return 'error'; }
$down = strtr ($string,
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQWERTYUIOPASDFGHJKLZXCVBNM',
'абвгдеёжзийклмнопрстуфхцчшщъыьэюяqwertyuiopasdfghjklzxcvbnm');
return $down;
}
$string = "Эту стРоку иСполЬзуют в поИсковикаХ";
$string = ruLow ($string);
// $string - строка полученная от пользователя
if ($string != 'error'){ print $string; }
?>
Так, обычно, поисковые системы типа Яндекс, фильтруют текст для поиска в своей базе.
7. Заменить все русские буквы на их эквиваленты.
<?php
function replace_cyr ($path){
$search = array ("'Ё'", "'А'", "'Б'", "'В'", "'Г'", "'Д'", "'Е'", "'Ж'", "'З'", "'И'", "'Й'", "'К'", "'Л'", "'М'", "'Н'", "'О'", "'П'", "'Р'", "'С'", "'Т'", "'У'", "'Ф'", "'Х'", "'Ц'", "'Ч'", "'Ш'", "'Щ'", "'Ъ'", "'Ы'", "'Ь'", "'Э'", "'Ю'", "'Я'", "'а'", "'б'", "'в'", "'г'", "'д'", "'е'", "'ж'", "'з'", "'и'", "'й'", "'к'", "'л'", "'м'", "'н'", "'о'", "'п'", "'р'", "'с'", "'т'", "'у'", "'ф'", "'х'", "'ц'", "'ч'", "'ш'", "'щ'", "'ъ'", "'ы'", "'ь'", "'э'", "'ю'", "'я'", "'ё'", "'0'e");
$replace = array ('Ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё', '0');
return preg_replace ($search,$replace,$path);
}
$stroka = "Меняйте кодировку, строка всегда одинаковая.";
// заменим все русские буквы
$new_stroka = replace_cyr ( $stroka );
print $new_stroka;
?>
Теперь в любой кодировке, в любой стране и в любом броузере страничка будет всегда такая, как Вы ее задумали. Но размер ее в байтах увеличивается, поэтому подумайте, а надо ли это вам, прежде, чем применять эту функцию, она больше для экзотики, так, чтобы можно видеть какая мощь в регулярных выражениях.
8. Функция анти-мат.
Если из формы нам передается от пользователя информация, то ее нужно проверить на использование несанкционированной лексики. То есть, заменять маты, например, на '*'. Для этого создадим файл 'autochange.dat' и в нем разместим строки с плохими словами так:
муда::*::
mуда::*::
myда::*::
мyда::*::
В первом отсеке располагаем мат, а во втором, то на что его будем менять. Нам надо сделать так, чтобы пользователь не смог воспользоваться пробелами в словах, переходами на новую строку, чередованием строчных и прописных букв, а так же английских букв эквивалентов. Во всех случаях функция должна заменять мат на звездочку. Файл анти-мат можно взять, скачав наш форум.
<?php
// файл база матов
$autochange = "autochange.dat";
// запишите 'autochange.dat' тут же в этой папке с этим фалом .php
// вот примерно как выглядит 'autochange.dat'
// козел::*::
// баран::*::
// дурак::*::
// тогда слова козел, баран, дурак буду заменены звездочками
// функция замены
function auto ($path){
global $autochange;
$general = file ($autochange);
if ( !empty ($general)){
for ($ii=0; $ii < count ($general); $ii++){
list ($aut3,$aut2) = explode ("::", $general[$ii]);
$aut3_arr = preg_split ("//",$aut3);
$content = '~';
for ($iii=0; $iii < sizeof ($aut3_arr); $iii++){ $content .= $aut3_arr[$iii]."[ \r\n\t]*"; }
$content .= '~is';
if ( preg_match ($content,$path)){$path = preg_replace ($content,' '.$aut2.' ',$path); }
}
}
return $path;
}
// такая строка
$path = "Вот козел, баран, дурак заменили";
// меняеем плохие слова
$new_path = auto ($path);
// теперь в $new_path нет слов, которые были в вашем файле "autochange.dat"
print $new_path;
?>
9. Заменить функцию parse_url своей.
Если parse_url работает нестабильно, то заменим её своей функцией:
<?php
// заменитель parse_url
function _parse_url ($path) {
preg_match ("~(.+)?:\/\/([ˆ\/]+)([ˆ\?]*)[\?]?([ˆ\/]*)~", $path, $arr);
if ($arr[0]==''){ return array ('path' =>$path); }
return array ('scheme' => $arr[1], 'host' => $arr[2], 'path' => $arr[3], 'query' => $arr[4]);
}
// проверим адрес http://www.f9r.ru/all.php?act=posixphp
$adress = 'http://www.f9r.ru/all.php?act=posixphp';
$arr = _parse_url ($adress);
// распечаетм массив массиве
print "<pre>";
print_r ($arr);
print "</pre>";
// получим
// Array
// (
// [scheme] => http
// [host] => www.f9r.ru
// [path] => /all.php
// [query] => act=posixphp
// )
?>
10. Преобразуем двойные кавычки в html в открывающие и закрывающие.
Двойные кавычки в html тексте могут обозначаться следующими способами:
" просто двойная кавычка
" заменитель html
“ открывающаяся, заменитель html “
” закрывающаяся, заменитель html ”
« открывающаяся, заменитель html «
» закрывающаяся, заменитель html »
« открывающаяся «
» закрывающаяся »
Заменим в строке все кавычки на открывающиеся и закрывающиеся в виде « и »
<?php
$str = 'Вот "такая" «дикая» "строка" Html';
function replace_kav ( $path ){
$path = str_replace ( '"', '"', $path );
$path = preg_replace ( "~&#(171|187);~s", '"', $path );
if ( ! preg_match ( "~"~", $path ) ) { return $path; }
$array = explode ( """, $path );
$lines = count ( $array );
$path = "";
for ( $i = 0; $i < $lines; $i++ ) {
if ( $i % 2 == 1 ) { $path .= $array [$i] . '»'; }
else { $path .= $array [$i] . '«'; }
}
return substr ( $path, 0, -7 );
}
// напечатем преобразованную строку
print replace_kav ( $str );
?>
Теперь усложним задачу и сделаем тоже самое, но в Html тексте
<?php
// будем изменять файл index.htm
// запишите файл index.htm тут же в этой паку с этим .php файлом
// поставьте в ЕГО тексте ПЛОХИЕ КАВЫЧКИ
$file = "index.htm";
function replace_kav ( $path ){
if ( is_file ( $path ) or preg_match ( "~http://~i", $path ) ) { $path = implode ("", file ( $path ) ); }
if ( preg_match ("~<[ˆ>]*>(.*)</[ˆ>]*>~s", $path)){
if ( preg_match ("~<body[ˆ>]*>(.*)</body[ˆ>]*>~is", $path, $arr)){
$_path = $arr[1];
}
else { $_path = $path; }
preg_match_all ( "~([>]+)([ˆ><]+)([<]+)~sU", $_path, $arr, PREG_PATTERN_ORDER );
while ( list ( $key, $val ) = @each ( $arr[2] ) ){
if ( ! preg_match ( "~\"~", $val ) ) { continue; }
$_val = preg_replace ( "~\"~s", '"', $val );
$path = str_replace ( $val, $_val, $path );
}
}
else { $path = str_replace ( '"', '"', $path ); }
$path = preg_replace ( "~(71|87);~s", '"', $path );
if ( !preg_match ( "~"~", $path ) ) { return $path; }
$path = preg_replace ("~“~", "«", $path);
$path = preg_replace ("~”~", "»", $path);
$path = preg_replace ("~(ˆ|[ \r\n\t]{1})""([\w]{1})~", "\\1««\\2", $path);
$path = preg_replace ("~([\w\.\?\!\+-]{1})""([ \r\n\t\.]?|$)~", "\\1»»\\2", $path);
$path = preg_replace ("~(ˆ|[ \r\n\t]{1})"([\w]{1})~", "\\1«\\2", $path);
$path = preg_replace ("~([\w\.\?\!\+-]{1})"([ \r\n\t\.]?|$)~", "\\1»\\2", $path);
$array = explode ( """, $path );
$lines = count ( $array );
$path = "";
for ( $i = 0; $i < $lines; $i++ ) {
if ( $i % 2 == 1 ) { $path .= $array [$i] . '»'; }
else { $path .= $array [$i] . '«'; }
}
$path = substr ( $path, 0, -7 );
if ( preg_match_all ("~<script[ˆ>]*>(.*)</script[ˆ>]*>~isU", $path, $arr, PREG_PATTERN_ORDER )){
while ( list ( $key, $val ) = @each ( $arr[1] ) ){
$_val = preg_replace ( "~&(l|r)aquo;~s", '"', $val );
$path = str_replace ( $val, $_val, $path );
}
}
return $path;
}
// распечатаем изменённый index.htm
print replace_kav ( $file );
?>