Reg. exp. Сохранение всех значений подмаски.

white phoenix

Новичок
Reg. exp. Сохранение всех значений подмаски.

Заранее прошу прощенья за идиотский вопрос, в регулярных выражениях у меня опыта не так много. Пишу шаблон для поиска подстрок, столкнулся с тем что нужно повторить подмаску несколько раз (в моем случае 1 и более раз), и сохранить значения в matches. Желая быть правильно понятым скажу, что нужно повторить несколько раз только часть искомой подстроки, а именно:
PHP:
(\[?(?:\s*\.\s*| (?:\s+|(?<=\[))  (?:'.implode('|',$dot).') (?:\s+|(?=\])) )\]?[a-z0-9]*)
Вот выражение целиком, оно работает так как нужно, но сохраняет только последнее значение подмаски, а нужно все:
PHP:
$pattern = 
'~'.
/* Mailbox	   */ '[a-z0-9_\-]+\s*'.
/* Separator   */ '(\[?(?:\s*@\s*|(?:(?:\s+|(?<=\[))(?:'.implode('|',$at).')(?:\s+|(?=\]))))\]?)\s*'.
/* Domain	   */ '[a-z0-9_\-]*'.
/* Dot and TLD */ '(?:\[?(\s*\.\s*| (?:\s+|(?<=\[))  (?:'.implode('|',$dot).') (?:\s+|(?=\])) )\]?[a-z0-9]*)+'.
'~ix';
$result = preg_match_all($pattern,$string,$matches,PREG_SET_ORDER);
PHP 5.1.0
Спасибо.
Выражение немного подредактировано
 

zarus

Хитрожопый макак
И какого вида ВСЕ подстроки ты хочешь получить? Все, что я получил, использовав твое выражение на тестовой строке [email protected] - это @ и .ru?
 

white phoenix

Новичок
Хочу получить все значения подмаски
PHP:
([?(?:s*.s*| (?:s+|(?<=[))  (?:'.implode('|',$dot).') (?:s+|(?=])) )]?[a-z0-9]*)
а не только последнее.
"[email protected] anonymous@nowhere dot net . ru":
PHP:
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(20) "[email protected]"
    [1]=>
    string(1) "@"
    [2]=>
    string(1) "."
  }
  [1]=>
  array(3) {
    [0]=>
    string(30) "anonymous@nowhere dot net . ru"
    [1]=>
    string(1) "@"
    [2]=>
    string(3) " . "
  }
}
Т.е. по индексу 0 лежит вся подстрока, по 1 то что принято за собаку (@|at|...), а по 2+ должны лежать все значения вышеуказанной подмаски, но там лежит только последнее.
 

zarus

Хитрожопый макак
Так, как ты хочешь не получится. Придется разбивать на 2 части
Сначала получаешь строку "nowhere dot net . ru"
а потом через preg_split(...) делишь ее на части. Там же есть флаг сохранения ограничителей PREG_SPLIT_DELIM_CAPTURE, соответственно, через var_dump разберешься, как тебе извлекать все ограничители.
Только я все равно не вижу смысла? Если это нужно, чтобы привести мыло к нормальному виду, то имеет смысл просто воспользоваться preg_replace, str_replace...
 

white phoenix

Новичок
zarus
> Так, как ты хочешь не получится.
Жаль, собственно хотел узнать только это.
> preg_split
Можно проще, через preg_replace.
> то имеет смысл просто воспользоваться preg_replace, str_replace...
Да, я сразу сделал
PHP:
$m_email = preg_replace('~\s+(\.|'.implode('|',$dot).')\s+~','.',$m_email);
Но знакомый сказал что нужно использовать str_replace, и перед этим рег. выражением получать все значения, оказалось это невозможно.
Спасибо, воспрос исчерпан.
 

zarus

Хитрожопый макак
Автор оригинала: white phoenix
Но знакомый сказал что нужно использовать str_replace, и перед этим рег. выражением получать все значения, оказалось это невозможно.
Спасибо, воспрос исчерпан.
Ну так что ты мне репу-то паришь? :)
Вот, что твой знакомый имел в виду:
PHP:
if preg_match_all('/(всякая_дот_фигня_через_|)/is',$str,$match) {
  foreach ($match[1] as $find) {
    str_replace($find,'.',$original_row);
  }
}
А твой вариант:
PHP:
$m_email = preg_replace('~\s+(\.|'.implode('|',$dot).')\s+~','.',$m_email);
лучше, поэтому пни своего знакомого покрепче.
 

white phoenix

Новичок
zarus
> Ну так что ты мне репу-то паришь?
Просто он сказал что не сохраняются все значения потому что "значит ты что-то не так делаешь", вот я подумал что туплю, а ты развеял мои сомнения.
> лучше, поэтому пни своего знакомого покрепче.
Думаю не стоит :)
 
Сверху