2010-06-10 59 views
0

我使用cURL來獲取網頁並呈現給我們的用戶。事情已經運作良好,直到我來到後使用相當數量的Ajax的網站,其格式,因此:Shell腳本執行正則表達式匹配/替換

33687|updatePanel|ctl00_SiteContentPlaceHolder_FormView1_upnlOTHER_NATL| 
             <div id="ctl00_SiteContentPlaceHolder_FormView1_othernationalities"> 
              <h4> 

               <span class="tooltip_text" onmousemove="widetip=false; tip=''; delayToolTip(event,tip,widetip,0,0);return false" 
                onmouseout="hideToolTip()"> 
                <span id="ctl00_SiteContentPlaceHolder_FormView1_lblProvideOTHER_NATL">Provide the following information:</span></span> 
              </h4> 
| 
266|scriptBlock|ScriptContentNoTags| 
    document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL').dispose = function() { 
     Array.remove(Page_Validators, document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL')); 
    } 

因此,每個響應部分是4個部分:2和3只是標識,4纔是真正的「體「,1是身體的長度。問題在於我們修改了主體,我需要能夠更新第一部分的長度以表明這一點;否則,當將其插入到網頁中時,我們會拋出解析錯誤。

我試圖找出shell命令的組合(AWK,sed的,別的什麼): 一)閱讀它保存的文件 b)運行正則表達式來收集信息的每個單獨的塊(使用「( c)使第一個捕獲組等於最後一個捕獲組的長度 d)將第一個捕獲組與第二個捕獲組的長度相等,所有到一個新的文檔或回正則表達式匹配保存到由「集體」原

任何投入將不勝感激。

回答

1

它看起來不像正則表達式的一個單一的線將解決這個問題,因爲沒有辦法把大括號{}之間的第一捕獲托架,以指示長度。這是我在想什麼是理想的:

(\d*?)\|([^|]+)\|([^|]+)\|(.{\1})\| 

這個值也無法繞開,因爲在該情況下,沒有一個轉義字符的跡象表明,有一個|郵件正文中的某處。我建議用'|'直接分割並使用二維數組來存儲內容。檢查每一個項目的匹配長度,如果太短,連接一個|和下一個項目,然後增加讀取計數器。 PHP將解釋:

$items=explode('|', $file) 
$len=count($items); 
$oi=0; 
$ol=-1; 
for($i=0;$i<$count;++$i){ 
    $output[$oi][++$ol]=$items[$i]; 
    if($ol==3){ 
    $target=$output[$oi][0]; 
    while(strlen($output[$oi][3])<$target){ 
     $output[$oi][3].='|'.$items[++$i]; 
    } 
    ++$oi; 
    $ol=-1; 
    } 
}