|
|
|
|
|
для: exp
(17.03.2008 в 22:43)
| | проверил
забылещё скобку закрыть и * :)
вот что имел ввиду
<?
$url=" http://site.ru/download.php?file=test ";
if (!preg_match('#^(http:\/\/)?(?:[a-z1-9][a-z0-9\-]+\.)+?[a-z]{2,4}(?:\/[a-z0-9\/\?\.\-_%&=]*)?$#i', ($url = trim($url)))) $url = '';
echo $url;
?>
|
тут обязательное только начинающееся с цифры или буквы слово (заканчивающееся точкой) из минимум двух букв
(?:[a-z1-9][a-z0-9\-]+\.)+? с повтором неограниченное число раз , можно ограничитьпоменяв +? на {1,4}
и последующая зона домена
[a-z]{2,4} | |
|
|
|
|
|
|
|
для: Ослик
(17.03.2008 в 20:49)
| | зависит от того для чего всё это
тут судя по функции проверялось поле для ввода url, которое может быть с путём до какого-нибудь файла и с GET-параметрами, добавлялось http:// , если явно не указан протокол
потом ещё для чего-то вся латиница переводилась в нижний регистр (помоему неправильно , разные буквы - разные пути)
а так если например вводится адрес файла для скачивания по http его сайтом, то можно упростить
например до такого
<?
if (!preg_match('~^(?:http://)?(?:[a-z1-9][a-z0-9\-]+\.)+?[a-z]{2,4}(?:/[a-z0-9/\?\.\-_%&=])?$~i', ($url = trim($url)) ) $url = '';
# или вместо $url = ''; return; наверное . потом так-же добавлять http:// если нет
# непроверял
|
но тоже ограничено слегка , например запрещает указывать порт, или @ , в путях непропустит символы ~@;,... которые там иногда бывают, и например такой адрес http://127.0.0.127/...
неподдерживает протокол кроме http
и наоборот пропустит адрес типа 1-.xx
идеальных способов нет, или есть но всё-равно адрес может не существовать и выражение будет больше
.... тоже применил подмаску (?: ), говорят лучше тем что не занимает память процесса поиска
книгу Фридла тоже никак не осилю :)
// поправил , забыл ! перед preg_match | |
|
|
|
|
|
|
|
для: exp
(17.03.2008 в 20:12)
| | Со вторым понял,спасибо.
exp,я немножко перефразирую вопрос по поводу первого.
Меня более интересует тот вопрос какое выражение вставить, ведь если я понимаю
то можно было бы написать просто так
$urll = "#^(http://)?[-a-z0-9\.]+([-a-z0-9]+\.(html|php|pl|cgi))?".
"([-a-z0-9_:@&\?=+\.!/~*'%$]+)?$#i";
и не воротить столько кода.
Отсюда вопрос - какое выражение по Вашему мнению ,лучше испозьзовать для проверки,с точки зрения безопасности ...???Если не затруднит ,посоветуйте пожалуйста.
З.Ы.за ссылку на справочник спасибо.
Сейчас вот читаю Фридла "Регулярные выражения"
пытаюсь вьехать...сначала вроде как просто и понятно,а чем дальше...не очень то получаеться | |
|
|
|
|
|
|
|
для: Ослик
(16.03.2008 в 23:55)
| | здесь в справочнике в функциях для работы с регулярными выражениями есть ссылка "синтаксис регулярных выражений"
при желании и творческой фантазии :) потестив с недельку можно многое понять
на словах нереально такое объяснить
"~^(?:(?: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"
|
если я скажу что здесь сначала выполняется поиск совпадения с первой незахватывающей подмаской , в которой есть другие незахватывающие подмаски , потом при совпадении вышеозначеной уже в поиске учавствует вторая незахватыва...........
:) второе выражение попроще
<?
preg_replace("/[^\x20-\xFF]/", "", @strval($str));
|
встроке заменяются на '' (всмысле удаляются) все символы (если кодировка однобайтная(не utf-8))
до пробела
посмотреть какой символ каким байтом (или байтами) обозначается можно например в windows нажать Пуск->Выполнить , вписать "charmap" -> Ok и при выборе например "!"
в самом низу будет строка U+0021 Exclamation Mark,
что означает что в юникоде этот символ на самом деле два байта с значениями в шестнадцатеричном представлении 00 и 21
:) справочник читать всё-же получше однако
вообщето не все символы в этой "charmap"
и возможно чем-то лучше можно найти в "eudcedit" | |
|
|
|
|
|
|
| Прошу знающих ,поясните "по человечески" регулярное выражение в такой функции .
То есть разрешеться только https|ftp|telnet или запрещается com|net|org и т.д? ...почему то ,это вроде как не работает.
Подкажите,пожалуйста плиз как расшифровать эти выражения что
находятся в preg_match и preg_replace.Мне понятно только ,что разрешены буквы нижнего регистра и цифры {от,до},а с остальным регулярным ... :-(
function f_url($urll)
{
$urll = trim(f_trim($urll));
if (strlen($urll) === 0) return '';
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", $urll, $ok)) return -1;
if (!strstr($urll, "://")) $urll = "http://".$urll;
$urll = preg_replace("~^[a-z]+~ie", "strtolower('\\0')", $urll);
return $urll;
}
function f_trim($str)
{
return preg_replace("/[^\x20-\xFF]/", "", @strval($str));
}
Вызов функции :
$url="http://".$_SERVER['SERVER_NAME']."".$_SERVER['REQUEST_URI'];
if (!empty($url))
{
$urll = f_url($url);
if (strlen($urll) < 3)
{
$errors = 'Неверно набранная Веб-страница ';
}
}
Заранее благодарю за помощь. | |
|
|
|
|