Wednesday, June 18, 2008

to keep fit in regex

Геп сегодня меня спросил: не подскажешь regex. который слово определенное в тексте ищет. Слово может быть обремлено пробелами, всевозможными знаками препинания
я задумался и написал
 /([^a-z]+)asd([^a-z]+)/i 
т.е. слово обрамленное как минимум одной не буквой (цифрой, пробелом, знаком препинания). но эта регулярка не срабатывала если слово находилось вначале или в конце строки. тогда я добавил условие что у слова слева или 0 любых символов от начала строки
 (^.{0}) 
или как минимум одна небуква
 ([^a-z]+) 
получилось:
 ((^.{0})|([^a-z]+)) 
а после слова идет как минимум одна небуква или 0 любых символов до конца строки, т.е.
 (([^a-z]+)|(.{0}$))
в итоге получилась регулярка
 /((^.{0})|([^a-z]+))asd(([^a-z]+)|(.{0}$))/i 
через js ее можно смотреть вот так:
 javascript:alert((/((^.{0})|([^a-z]+))asd(([^a-z]+)|(.{0}$))/i.test("as3asd3  sasd"))?"y":"n");
или через php вот так:

$tests = array("asd", "asdasd", "asd1", "123asde33", "qwe 3 sdasd 3asd3");
foreach ($tests as $test)
echo $test . ' '. intval(preg_match('/((^.{0})|([^a-z]+))asd(([^a-z]+)|(.{0}$))/i', $test)) . "
";

2 comments:

  1. эх, жалко на блоггере нет никакой статистики, так бы я обязательно сказал сколько месяцев уже не было ни одного комментария на мой бред =)

    ReplyDelete