Регулярки, что бы их... етить

Voyager2K

Новичок
Регулярки, что бы их... етить

Ну не умею с этими чудищами обращаться. Попытки найти НОРМЛАЬНЫЙ ПОЛНОЦЕННЫЙ в попыхах учебник ни к чему не приводят(а фишки в таком роде слишком скудны информацией http://www.zytrax.com/tech/web/regex.htm#search). Вся ночь впереди, столько хотел сделать... а все на месте стоит из-за одной регулярки. Спрашиваю как это сделать ?

$str = 'word1 word2 # word3';
preg_math('/^(.*?)#{0,}(.*)/i', $str, $result);

Строка $str может содеражть, а может и не содержать символ #. Каким образом мне в случае наличия # разбить строку на строку до первого вхождения и все остальное ? В случае отсутсвия # вернуть всю строку.

В вышеуказанном примере, если я уж окончательно не запутался, # проигнорируется и квантификатор поейдет жрать все подряд. Если указать #{1}, то ведь не регулярка вообще ничего не вернет в случае отсутсвия #.
 

sage

Новичок
вариантов масса ;)
PHP:
$str = 'test1 # test2 # test3 test4';

$parts = array();
if (false !== strpos($str, '#')) {
   $parts[] = substr($str, 0, strpos($str, '#')); // test1
   $parts[] = substr($str, strpos($str, '#') + 1); // test2 # test3 test4
}
print_r($parts);


print_r(preg_split('!#!', $str, 2));


print_r(explode('#', $str, 2));
 

Voyager2K

Новичок
sage, вот вчера примерно в таком стиле реализовал, ибо ибо не надеялся получить ответа. Однако это не способ, хотелось одной тсрокой: регуляркой.

kamatoz это чудо работает, вот только не пойму как =) Ведь ^ в квадратных скобках означает исключение всего содержимого этих скобок, если мне не изменяет память. Как так получается, исключая требуемый символ и вообще любой символ, да повторяя это квантификатором... оно работает.
 

sage

Новичок
Voyager2K
внимательно мой пост посмотри =) последние 2 решения - это решения одной строкой
 

Voyager2K

Новичок
sage, а верно =) не дочитал. Извиняюсь. Просто в действительности немного более все гружено, и сплитами не так удобно.

Еще такой вопрос по регуляркам в тогонку(надеюсь не надоел еще), а то никак не могу понять все же как завстаить брать все символы после определенного места до другого определенного места. Ибо к решению kamatoz нужны комментарии, а то не пойму как оно работает.
Есть строка типа:
$str = '[KEY1]=value1 value1 value1 [KEY2]=value2 value2 value2';
Таких ключей может быть великое множество.
Цель регуляркой выцепить значение необходимого ключа.

Допустим, пытаюсь достать KEY1
вариант типа : /\[KEY1\]=(.*?)(\[[a-z0-9]+\]=){0,1}/i
опять все жрет эта паганая .*? и опять же, если строго фиксировать границу т.е. {1}, не получится достать последнюю связку ключ-значение.
 

sage

Новичок
опять же есть несколько способов:
1) если в значении никогда не будет содержаться [
PHP:
preg_match('!\[KEY1\]=([^[]+)!', $str, $matches);
print_r($matches);
2) если п.1 не выполняется
PHP:
preg_match('!\[KEY1\]=(.+?)(?=$|\[KEY)!', $str, $matches);
print_r($matches);
 

Voyager2K

Новичок
sage, п.2 однозначно надежнее. Домодернизировал до:
PHP:
preg_match('/\[KEY1\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i',$str,$r);
Надеюсь в таком стиле регулярка не вызовит "сбоев".

Спасибо всем за оказанную помощь.
 
Сверху