special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Несколько примеров регулярных выражений

По теме:


Является ли строка числом, длиной до 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);

Найти текст, заключенный в какой-то тег, например <TITLE> ... </TITLE> из HTML-файла ($string - исходный текст).

if (preg_match("!(.*?)!si",$string,$ok))
 echo "Тег найден, текст: $ok[1]";
else
 echo "Тег не найден";

Найти текст, заключенный в какой-то тег и заменить его на другой тег, например: <TITLE> ... </TITLE> заменить аналогично на <МОЙ_ТЕГ> ... </МОЙ_ТЕГ> в HTML-файле:

preg_replace("!(.*?)!si","<МОЙ_ТЕГ>\\1",$string);

Подсветка PHP-кода в сообщениях

К примеру, у вас есть форум типа vBulletin, где можно подсвечивать код, если его выделить специально: [PHP] любой код [/PHP].

В итоге, после этого (при просмотре сообщения), получается красивый и цветной php-код.

И так, если вы хотите, чтобы все куски между [PHP]..[/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]; } ?> ($ok[1]);> [^>
($ok[1]);> [^> ($ok[1]);>
*?href=\"?'?([^>

Результат исполнения примера:

Исходный код:
<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---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - < скобки >
  • url5 - жирно
  • url6 - "кавычки"
  • url7 - 77777
  • url8 - хахаха" >88888
    ---------------Вариант 2---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - < скобки >
  • url5 - жирно
  • url6 - "кавычки"
  • url8 - хахаха" >88888
    ---------------Вариант 3---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url6 - "кавычки"

  • Created/Updated: 25.05.2018

    ';>