2010-07-28 92 views
0

我有一個正則表達式數組,並且試圖通過文本文檔循環查找第一個模式,將其指定爲數組的鍵,然後繼續查找第二個模式並賦值作爲價值。每當我遇到模式1時,我都希望它始終被分配爲一個鍵,並且所有模式2都匹配,直到遇到一個新鍵爲止,該鍵將被分配給該第一個鍵作爲值。將正則表達式模式指定爲數組的鍵

文本文檔結構:

Subject: sometext 

Email: [email protected] 

source: www.google.com www.stackoverflow.com www.reddit.com 

所以我有表情的數組:

$expressions=array(
       'email'=>'(\b[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b)', 
       'url'=>'([A-Za-z][A-Za-z0-9+.-]{1,120}:[A-Za-z0-9/](([A-Za-z0-9$_.+!*,;/?:@&~=-])|%[A-Fa-f0-9]{2}){1,333}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;/?:@&~=%-]{0,1000}))?)' 
       ); 

我想遍歷我的文本文檔和匹配的電子郵件地址,然後分配爲重點,以一個數組然後指定所有跟隨的URL作爲值,輸出到上面的文本將是:

array(
    '[email protected]' => array (
     0 => 'www.google.com', 
     1 => 'www.stackoverflow.com', 
     2 => 'www.reddit.com' 
    )  
+0

你能不能改一下你的問題,可能是顯示您所描述的陣列? (即輸入以及預期輸出) – mvds 2010-07-28 13:03:57

+0

您可以舉例嗎? – Toto 2010-07-28 13:05:42

+0

好的,表達式在數組中的含義是什麼?它總是有2個元素,還是3個或更多? – mvds 2010-07-28 13:22:38

回答

0

一種方式做這樣的事情:

$parts = preg_split("/(emailexpr)/",$txt,-1,PREG_SPLIT_DELIM_CAPTURE); 

$res = array(); 

// note: $parts[0] will be everything preceding the first emailexpr match 
for ($i=1; isset($parts[$i]); $i+=2) 
{ 
    $email = $parts[$i]; 
    $chunk = $parts[$i+1]; 
    if (preg_match_all("/domainexpr/",$chunk,$match)) 
    { 
     $res[$email] = $match[0]; 
    } 
} 

與正則表達式替換的胡言亂語和emailexprdomainexpr

0

我會做:

$lines = file('input_file', FILE_SKIP_EMPTY_LINES); 
$array = array(); 
foreach($lines as $line) { 
    if(preg_match('/^Subject:/', $line) { 
    $email = ''; 
    } elseif(preg_match('/^Email: (.*)$/', $line, $m)) { 
    if(preg_match($expressions['email'], $m[1])) { 
     $email = $m[1]; 
    } 
    } elseif(preg_match('/^source: (.*)$/', $line, $m) && $email) { 
    foreach(explode(' ', $m[1]) as $url) { 
     if(preg_match($expressions['url'], $url)) { 
     $array[$email][] = $url; 
     } 
    } 
    } 
} 
+0

這會抱怨初始化的數組元素和一個未初始化的變量,無論是處理還是'$ array' – mvds 2010-07-28 14:33:57

+0

,你都應該看一下'preg_match_all',它會使事情變得更清潔(它將結合foreach,explode和'preg_match',加上它可以防止'$ array [$ email]'沒有被設置的警告。 – mvds 2010-07-28 14:35:47

+0

你能告訴我怎麼做嗎? – 2010-07-28 14:57:16

相關問題