Июл 142011
 

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

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

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/ и переделана ( не люблю копипаста)
Буду рад, если кто привнесет полезные регулярные выражения в коллекцию :) + сам буду дописывать, по мере столкновения с новыми.

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

Результаты

Загрузка ... Загрузка ...
Дорогие читатели! Мною было принято решение закрыть комментарии на блоге. Теперь все обсуждения переносятся на недавно открытый форум, ввиду того, что формат сообщений там намного удобней для обсуждения. Не стесняйтесь задавать любые вопросы по тематике блога! Я всегда на связи.
Перейти на форум
.

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

  1. Вроде наборчик ничего.
    Только список явно маловат.
    Надо добавить.

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

    В массиве $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 «ДА»;

  3. Состоит ли строка только из букв, цифр и «_», длиной от 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;
    }

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

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

Извините, форма комментирования закрыта в данный момент.