Помогите с регэкспом

[Gisma]

Новичок
Помогите с регэкспом

Есть строка
This is sample string. My name is "Ivan.Durak". Tell me about you.
можно ли разрезать ее по регэкспу так что бы на выходе получили три строки
This is sample string
My name is "Ivan.Durak"
Tell me about you
Трудность ессно в том как исключить точку из парсинга, если она находится между кавычками.
 

WP

^_^
PHP:
$string = 'This is sample string. My name is "Ivan.Durak". Tell me about you.';
$GLOBALS['mtags'] = array();
$result = preg_split('~\.\s*~',preg_replace_callback('~"(.*?)"~si',create_function('$a','$n = -1; while ($n == -1 or isset($GLOBALS[\'mtags\'][$n])) {$n = rand(0,getrandmax());} $GLOBALS[\'mtags\'][$n] = $a[1]; return \'"\'.chr(0).$n.\'"\';'),$string));
foreach ($result as $k=>$v) {$result[$k] = preg_replace_callback('~\x00(\d+)~i',create_function('$a','return $GLOBALS[\'mtags\'][$a[1]];'),$v);}
var_dump($result);
/*
array(4) {
  [0]=>
  string(21) "This is sample string"
  [1]=>
  string(23) "My name is "Ivan.Durak""
  [2]=>
  string(17) "Tell me about you"
  [3]=>
  string(0) ""
}
*/
 

[Gisma]

Новичок
даже и не буду просить чтобы объяснил работу:)

-~{}~ 23.05.06 22:01:

круто сделано! спасибо!

-~{}~ 23.05.06 22:11:

Хотя мой парсер, как ни странно работает быстрее o_0,
PHP:
                $nSize = strlen($str);
		$tmp = $str;
		$szParam = '';
		$aParameter = array();
		$i = 0;
		while ($i < $nSize) {
			if ($tmp[$i] == '.' ) {
				$aParameter[] = $szParam;
				$szParam = '';
				$cPrev = '';
				$i++;
			} elseif ($tmp[$i] == '\'' || $tmp[$i] == '"') {
				
				// поиск кавычки 
				if ($tmp[$i] == '\'') {
					
					do {
						$nPos = strpos($str,'\'',$i + 1);
						
						if ($nPos === FALSE)  {
							// Сбрасываем данные и выходим
							$aParameter[] = $szParam.substr($str,$i);
							$i = $nSize;
							$nPos = $nSize;
							
						} elseif ($str[$nPos - 1] != '\\') {
							
							// Не слеш значит закрываем ковычку
							$szParam .= substr($str,$i,$nPos - $i);
							$i = $nPos;
						} elseif ($str[$nPos - 1] == '\\'){
							$szParam .= substr($str,$i,$nPos - $i - 1);
							$i = $nPos;
							$nPos = strpos($str,'\'',$i + 1);
							$i++;
						}else {
							$i++;
						}
					} while ($i != $nPos);
					$szParam .= '\'';
					$i++;
					
					
				}
				if ($tmp[$i] == '"') {
					do {
						$nPos = strpos($str,'"',$i + 1);
						if ($nPos === FALSE)  {
							// Сбрасываем данные и выходим
							$aParameter[] = $szParam.substr($str,$i);
							$i = $nSize;
							$nPos = $nSize;
						} elseif ($str[$nPos - 1] != '\\') {
							// Не слеш значит закрываем ковычку
							$szParam .= substr($str,$i,$nPos - $i);
							$i = $nPos;
						} elseif ($str[$nPos - 1] == '\\'){
							$szParam .= substr($str,$i,$nPos - $i - 1);
							$i = $nPos;
							$nPos = strpos($str,'\'',$i + 1);
							$i++;
						}else {
							$i++;
						}
					} while ($i != $nPos);
					$szParam .= '"';
					$i++;
				}	
			} else {
				$szParam .= $str[$i];
				$i++;
			}
			
		}
		if ($i <= $nSize) {
			$aParameter[] = $szParam.substr($str,$i);
		}
		return $aParameter;
сорри за код вставленный конечно:)
 

WP

^_^
[Gisma]
Работает элементарно =) Заменяет всё что в ковычках на спец. последовательности и записывает содержание, затем сплитит, а потом обратно возвращает. Это я из своего парсера BB-кода переделал, но там посложнее выражение =)
Штука у тебя прикольная.
 

[Gisma]

Новичок
Я забыл также сказать что нужна обработка еще одинарных кавычек, это моя вина хотя опять же спасибо за регэкспы:) принцип понятен
 
Сверху