Регулярные выражения на php в примерах

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

Вытащить расширение файла

echo preg_replace("/.*?\./", '', 'file.txt'); // получим txt

Получить все, что находится между тегами

$str='<tag>some text</tag><tag>some text2</tag>';
$str2 = preg_match('|<tag.*>(.*)</tag>|sei', $str, $res);
echo  $res[1]; // получим some text

Получить все, что находится между тегами (жадный вариант: вытащит все, до последнего совпадения)

$str='<tag>some text</tag><tag>some text2</tag>';
$str2 = preg_match('|<tag.*?>(.*)</tag>|sei', $str, $res);
echo  $res[1]; // получим some text</tag><tag>some text2

Найти текст между тегами, и «обвернуть» текст другим тегом

$str='<tag>text</tag>';
echo preg_replace("!<tag>(.*?)</tag>!si","<tag2>\\1</tag2>",$str);

Проверка: число / не число

$var='fdd';
if (!preg_match("|^[\d]+$|", $var))
{
echo 'НЕ число!';
}
else
{
echo 'число!';
}

переменная может содержать только русс. / лат. символы, пробел, цифры, знак _

$var='text@';
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$var)) {
        die( "переменная содержит недопустимые символы!" );
}

валидность email адреса

$email='text';
if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$email)) {
        die( "это не email");
}

Является ли значение переменной строкой, состоящей из символов латиницы и имеющая длину до 10 символов

$str='fghh';
if (ereg("^[A-Za-z]{1,10}$",$str)) echo "Это строка из символов латиницы не более 10 символов";

небольшие правки позволят расширить диапазон набора символов

$str='fghh';
if (ereg("^[A-Za-zА-Яа-яЁё0-9]{1,10}$",$str)) echo "Это строка из лат., рус. и цифр не более 10 символов";

Проверка есть ли в строке не менее 3-х одинаковых символов подряд

$string='теккккст';
if (preg_match("/(.)\\1\\1/",$string)) echo "yes"; else echo "no";

обрезание лишних пробелов

$string = 'слово   было три пробела';
echo $string=preg_replace("/  +/"," ",$string);

обрезание повторяющихся знаков препинания, если их более трех

$string = preg_replace('#(\.|\?|!|\(|\)){3,}#', '\1\1\1', $text);

замена ссылок в виде http://site.ru на кликабельную ссылку

$str = 'текст со ссылкой http://subcoder.ru';
echo $str = preg_replace('#(?$0', $text);

замена одного на другое, я так смайлы парсил в скрипте чата )

$find=array(':)', ':D', ':(');
        $replace = array('<img src="smiles/ab.gif">','<img src="smiles/ag.gif">', '<img src="smiles/ac.gif">');
        $value = str_replace($find, $replace, 'привет :)');
        echo $value;

ищем совпадение в строке

if (!preg_match("/php/i", "PHP is the web scripting language of choice.")) { //если нет совпадения "php" в строке "PHP is the web scripting language of choice."
    echo "A match was not found."; // то выводим что его нет
} else {
    echo "A match was found.";
}

Пропускаем только русские буквы, пробел и знак —

setlocale (LC_ALL, 'ru_RU');
if (preg_match("/[^а-яА-ЯёЁ -]/i",$var))
	{
		die ('используйте только буквы русского алфавита пробел и тире.');
	}

Большая часть выражений взята с сайта http://htmlweb.ru/ и переделана ( не люблю копипаста)
Буду рад, если кто привнесет полезные регулярные выражения в коллекцию :) + сам буду дописывать, по мере столкновения с новыми.

Помогла статья с регулярными выражениями?

Результаты

Загрузка ... Загрузка ...

Регулярные выражения на php в примерах: 7 комментариев

    1. ОзимОзим Автор записи

      я не против, в студию то, что можно добавить.

  1. Виктор

    Парсер всех внешних и внутренних ссылок со страницы

    В массиве $vnut только ссылки внутренние, в массиве $vnech только внешние ссылки.

    $html=file_get_contents (‘http://www.popsu.net’);
    $url=’popsu.net’;
    $vnut=array();
    $vnech=array();
    preg_match_all(‘~<a [^]*href=[\'»]([^\'»]+)[\'»][^]*>(((?!~si’,$html, $matches);
    foreach ($matches[1] as $val) {
    if (!preg_match(«~^[^=]+://~», $val) || preg_match(«~^[^://]+://(www\.)?».$url.»~i», $val)) { $vnut[]=$val; }
    else $vnech[]=$val;
    }
    $vnut=array_unique ($vnut);
    $vnech=array_unique ($vnech);
    print_r ($vnut);
    print_r ($vnech);

    Является ли строка числом, длиной до 80 цифр:

    if (preg_match(«/^[0-9]{1,80}$/»,$string)) echo «ДА»;

  2. Виктор

    Состоит ли строка только из букв, цифр и «_», длиной от 8 до 20 символов:

    if ( ! preg_match(«/[^a-zа-я0-9_]/»,$string))
    echo «нет посторонних букв (OK)»;
    else
    echo «есть посторонние буквы (FALSE)»;

    Проверка URL на корректность
    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(‘\’)»,$url);
    return $url;
    }

  3. кирилл

    Пропускаем только русские буквы, пробел и знак — это пригодилось
    отпиши на мыло когда ответишь об этом
    есть два поля в форме, нужно проверить так их оба, только одно из них может быть и пустым ? парюсь уже целый вечер

    1. ОзимОзим Автор записи

      а причем тут регулярные выражения?

  4. кирилл

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

Комментарии запрещены.