2010-06-10 4 views
0

J'utilise cURL pour obtenir une page Web et la présenter à nos utilisateurs. Les choses ont bien fonctionné jusqu'à ce que je suis tombé sur un site web en utilisant des quantités considérables d'Ajax qui est formaté si:Scénarisation shell pour effectuer une correspondance/remplacement d'expressions rationnelles

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')); 
    } 

Ainsi, chaque partie de la réponse est de 4 parties: 2 et 3 ne sont que des identifiants, 4 est le corps réel » ", et 1 est la longueur du corps. Le problème vient du fait que nous modifions le corps, et je dois pouvoir mettre à jour la longueur de la 1ère partie pour l'indiquer; Dans le cas contraire, nous lançons une erreur d'analyse lors de l'insertion dans la page Web. (En utilisant « a) lire le fichier enregistré b) exécuter une expression rationnelle pour rassembler chaque bloc d'information individuel (:

J'essaie de trouver une combinaison de commandes shell (awk, sed, peu importe) à \ d *?) \ | (. ?) \ | (.?) \ | (. *?) \ | ') c) rendre le premier groupe de capture égal à la longueur du dernier groupe de capture d) enregistrer toutes les correspondances regex à un nouveau document ou revenir à l'original

Toute contribution de "le collectif" serait grandement appréciée.

Répondre

1

Il ne semble pas qu'une seule ligne de RegEx résoudra ce problème, car il n'y a aucun moyen de mettre la première parenthèse capturée entre {accolades} pour indiquer la longueur. Voilà ce que je pense serait idéal:

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

Cette valeur peut pas non plus être contournée parce qu'il n'y a pas d'indication d'un caractère d'échappement dans le cas où il y a un | quelque part dans le corps du message. Je suggère une division droite par '|' et en utilisant un tableau bidimensionnel pour stocker le contenu. Vérifiez chaque article pour une longueur correspondante et si elle est trop courte, concaténez un | et l'élément suivant, puis incrémenter le compteur de lecture. PHP doit expliquer:

$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; 
    } 
} 
Questions connexes