Несколько примеров регулярных выражений
Является ли строка числом, длиной до 77 цифр:
if (ereg("^[0-9]{1,77}$",$string)) echo "yes"; else echo "no";
Состоит ли строка только из букв, цифр и "_", длиной от 5 до 20 символов:
if (ereg("^[a-zа-я0-9_]{5,20}$",$string)) echo "yes"; else echo "no";
Есть ли в строке любые символы, кроме допустимых. Допустимыми считаются буквы, цифры и "_". Длину тут проверять нельзя, разве что просто дополнительным условием strlen($string). Не путайте с предыдущим примером - хоть результат и одинаковый, но метод другой, "от противного"
if ( ! ereg("[^a-zа-я0-9_]",$string)) echo "нет посторонних букв (OK)"; else echo "есть посторонние буквы (FALSE)";
Для регистро независимого сравнения используйте eregi().
Есть ли в строке идущие подряд символы, не менее 3-х символов подряд (типа "абвгДДДеё", но не "ааббаабб"):
if (preg_match("/(.)\\1\\1/",$string)) echo "yes"; else echo "no";
Заменить везде в тексте СТРОКУ1 на СТРОКУ2 (задача решается без регегулярных выражений):
$string=str_replace("СТРОКА1","СТРОКА2",$string);
Заменить кривые коды перехода строки на нормальные: для этого нужно только удалить "\r".
Переходы бывают нормальными (но разными!): "\n" или "\r\n".
Еще бывают глюки, типа "\r\r\n".
$string=str_replace("\r","",$string);
Заменить все повторяющиеся пробелы на один. Не пытайтесь здесь применить str_replace, это хорошая функция, но не для данного примера.
$string=preg_replace("/ХХ+/","Х",$string); // вместо Х поставьте пробел
В тексте есть некоторые слова, допустим "СЛОВО" и "ЛЯЛЯЛЯ" (и т.д.), которые нужно одинаковым образом заменить на тоже самое, но с добавками.
Возможно, слова отсутствуют или встречаются много раз в любом регистре.
Т.е. если было "слово" или "СлОвО" (или еще как), нужно заменить это на "<b>слово</b>" или "<b>СлОвО</b>" (смотря, как было).
Другими словами нужно найти перечень слов в любом регистре и вставить по краям найленных слов фиксированные строки (на "<b>" и "</b>").
$string=preg_replace("/(слово1|слово2|ляляля|слово99)/si","\\1",$string);
Найти текст, заключенный в какой-то тег, например
if (preg_match("!(.*?) !si",$string,$ok)) echo "Тег найден, текст: $ok[1]"; else echo "Тег не найден";
Найти текст, заключенный в какой-то тег и заменить его на другой тег, например:
preg_replace("!(.*?) !si","<МОЙ_ТЕГ>\\1МОЙ_ТЕГ>",$string);
Подсветка PHP-кода в сообщениях
К примеру, у вас есть форум типа vBulletin, где можно подсвечивать код, если его выделить специально:
В итоге, после этого (при просмотре сообщения), получается красивый и цветной php-код.
И так, если вы хотите, чтобы все куски между
Текст программы.
<? // исходное сообщение: // ------------------------------------------------------ $str=' Памагите, ничаво не работает! Вот пример: [php] // comment # comment phpinfo(); [/php] ляляля ляляля [php] for ($i=0; $i<100; $i++) { ping("-f","www.ru"); } [/php] <? echo "<a href=http://shram.kiev.ua/>click here!</a>"; phpinfo(); ?> '; // ------------------------------------------------------ // подавить предупреждения (в highlight_string есть глюки) error_reporting(0); // функция подсвечивания одного куска текста function _my_($s,$a1,$a2) { if ($a1!="<?") { $a1="<?"; $a2="?>"; } $s=str_replace("\\\"","\"",$s); ob_start(); highlight_string($a1.$s.$a2); $s=ob_get_contents(); ob_end_clean(); return $s; } // ищем в тексте все куски между <?... или [PHP]... $str=preg_replace("!(\[php\]|<\?)(.*?)(\[/php\]|\?>)!ise","_my_('\\2','\\1','\\3')",$str); echo $str; ?>
После такой программы на экране получается:
Памагите, ничаво не работает! Вот пример:
<?
// comment # comment phpinfo(); ?>ляляля ляляля <? for ($i=0; $i<100; $i++) { ping("-f","www.ru"); } ?><? echo "<a href=http://shram.kiev.ua/>click here!</a>"; phpinfo(); ?> |
Как видно, все, что было между спец.строками подсветилось, а посторонний текст никак не изменился. Если вы собираетесь применять для форума, то подумайте и о переходах на новые строчки.
Если у вас все сообщение - это сплошной код, то используйте highlight_string напрямую, без поиска
Проверка URL на корректность
Это функция взята из исходников чата.
Поддерживает все, что только может быть в УРЛ...
Помните о том, что вы должны не только проверять, но и принимать новое значение
от функции, т.к. та дописывает "http://" в случае его отсутствия.
// доп. функция для удаления опасных сиволов function pregtrim($str) { return preg_replace("/[^\x20-\xFF]/","",@strval($str)); } // // проверяет URL и возвращает: // * +1, если URL пуст // if (checkurl($url)==1) echo "пусто" // * -1, если URL не пуст, но с ошибками // if (checkurl($url)==-1) echo "ошибка" // * строку (новый URL), если URL найден и отпарсен // if (checkurl($url)==0) echo "все ок" // либо if (strlen(checkurl($url))>1) echo "все ок" // // Если протокола не было в URL, он будет добавлен ("http://") // function checkurl($url) { // режем левые символы и крайние пробелы $url=trim(pregtrim($url)); // если пусто - выход if (strlen($url)==0) return 1; //проверяем УРЛ на правильность 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",$url,$ok)) return -1; // если не правильно - выход // если нет протокала - добавить if (!strstr($url,"://")) $url="http://".$url; // заменить протокол на нижний регистр: hTtP -> http $url=preg_replace("~^[a-z]+~ie","strtolower('\\0')",$url); return $url; }
Таким образом для проверки нужно использовать нечто такое:
$url=checkurl($url); // перезаписали УРЛ в самого себя if ($url) exit("Ошибочный URL");
Проверка правильности E-mail
Проверка правильности E-mail - проверять аналогично предыдущему примеру.
// // проверяет мыло и возвращает // * +1, если мыло пустое // * -1, если не пустое, но с ошибкой // * строку, если мыло верное // function checkmail($mail) { // режем левые символы и крайние пробелы $mail=trim(pregtrim($mail)); // функцию pregtrim() возьмите выше в примере // если пусто - выход if (strlen($mail)==0) return 1; 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",$mail)) return -1; return $mail; }
Вырезание URL из текста и кривых HTML-файлов
Иногда нужно вырезать из HTML-текст ссылки на URL или Email.
Если у вас в HTML нет заведомо кривого кода, то это очень простая задача на регулярное выражение типа:
]+href=([^ >]+)[^>]*>(.*?)
Но ссылки бывают разные... Как делать вашу программу, решать вам.
Можно брать только 100% верные ссылки, но тогда некоторые кривые сслыки не попадут (хотя они тоже верные).
Можно брать все подряд, но тогда кое-какие ссылки будут не совсем корректно вырезаться.
Текст программы:
<? $str=" <a href=url1>name1</a> <a href=url2>name2</a> <a href='url3'>name3</a> <a href=url4>< скобки ></a> <a href=\"url5\"><b>жирно</b></a> <a href=url6>\"кавычки\"</a> <a target=\"<попытка обхитрить программу> хахаха\" href=url7>77777</a> <a href=url8 target=\"<попытка обхитрить программу> хахаха\" >88888</a>"; echo "<pre>Исходный код:".htmlspecialchars($str)."</pre>"; echo "---------------Вариант 1---------------"; preg_match_all("!]+)\"?'?.*?>(.*?)!is",$str,$ok); for ($i=0; $i ".$ok[1][$i]." - ".$ok[2][$i]; } echo "
---------------Вариант 2---------------"; preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; } echo "
---------------Вариант 3---------------"; preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; } ?>
Результат исполнения примера:
Исходный код: <a href=url1>name1</a> <a href=url2>name2</a> <a href='url3'>name3</a> <a href=url4>< скобки ></a> <a href="url5"><b>жирно</b></a> <a href=url6>"кавычки"</a> <a target="<попытка обхитрить программу> хахаха" href=url7>77777</a> <a href=url8 target="<попытка обхитрить программу> хахаха" >88888</a> ---------------Вариант 1--------------- ---------------Вариант 2--------------- ---------------Вариант 3--------------- |
Created/Updated: 25.05.2018