воскресенье, 18 мая 2014 г.

Regexp cheatsheet

Метасимволы
\ - экранирование
. -  любой символ кроме \n
? - ноль или одно совпадение
+ - одно или более совпадений, например /a+b/ = ab, aab, aaaaab, но не b
* ноль или более совпадений
{m}, {m,n} - точное число повторений. Например для '/tre{1,2}f/ будет tref, treef, но не treeef. Если n не указано, то максимальное число совпадений не определено, если m не указан, то минимальное число = 0
^ - начало строки
$ -  конец строки
[ ...] - класс искомых символов, с помощью - диапазон. если дефис - часть класса, то ставить его последним. Если же [^...] то значит отрицание класса. /[0-9]+/, /[^0-9]+/  Метасимволы внутри использовать нельзя!
( ... ) - вложенный шаблон
(?: ... ) - шаблон участка строки, который не должен попасть на выход выражения. preg_match('@([A-Za-z ]+)(?:hans)@', 'Derick Rethans', $matches);  $matches = Derick Rethans, Derick Ret
(?P<имя> ... ) - именованный шаблон.

Cпец символы
\t - табуляция
\d - любая цифра, тоже что [0-9]
\D - не цифра [^0-9]
\s - любой пробельный символ [\t\f\r\n]
\S - любой не пробельный символ
\w - любой символ, часть слова, т.е. буква, цифра или _
\W - наоборот
\b - граница слова, позиция между \w и \W
    $string = "##Testing123##";
    preg_match('@\b.+\b@', $string, $matches);
    Результат: Testing123
\B любая позиция кроме начала и конца слова
    $string = "Testing";
    preg_match('@\B.+\B@', $string, $matches);
    Результат: estin
\Q...\E - отключение шаблона. @\Q.+*?\E@ будет строкой '.+*?'

Жадность
Пример. <a href="http://php.net/">PHP</a> has an <a href="http://php.net/menual">excellent</a>. Нужно выбрать содержимое ссылок. Например через '@<a.*>(.*)</a>@'. Но он выберет всё от начала и до manual". Если после + или * поставить ? то будет браться минимальное совпадение
'@<a.*?>(.*?)</a>@

Модификаторы
/[a-z]/ - любой символ из a..z
/[a-z]/i - любой из a..z и A..Z
m - многострочный поиск '@^DEF@m'
s - однострочный поиск
х - пропуск пробелов и комментариев в тексте шаблона. типа '@A B C@'x = '@ABC@"
U - по дефолту все станут ленивыми а с ? жадными
u - режим кодировки UTF-8

Примеры
/^([0-9a-f][0-9a-f]:){5}[0-9a-f][0-9a-f]$/ - макадрес
/^(0-9a-f]{2}:){5}[0-9a-f]{2}$/
'/\w+\s+\w+/' - два слова разделенные пробелами
'/(\d{1,3}\.){3}\d{1,3}/' - ip адрес

Чо делать с регэкспами?
Поиск
preg_match - поиск в строке по шаблону и если совпадает то true
preg_match_all - поиск всех совпадений
preg_grep - поиск в строках

Замена
preg_replace
Ссылаются на совпадения с помощью обратных ссылок
заменим все [link url="www.php.net"]PHP[/link] на настоящие
$str = '..';
$pattern = '@\[link\ url="([^"]+)"\](.*?)\[/link\]@';
$repl = "<a href="\\1">\\2</a>";
$str = preg_replace($pattern, $replacement, $str);

\\1 и \\2 - обратные ссылки, можно записать как $1 $2

Пример замен
$text = preg_replace('#(\:|\;|\,|\.|\?|!|\(|\)){2,}#', '\1', $text); - замена повторяющихся более двух раз подряд знаков препинания на один
$text = preg_replace('/(?<!\d)[,.;:]|[,.;:](?!\d{3})/', '$0 ', $text); - установка пробелов после знаков препинания с учетом цифр

Разделение
preg_split

Комментариев нет:

Отправить комментарий