我正在使用cURL获取网页并向我们的用户展示。事情一直很好,直到我使用大量格式化的Ajax来访问一个网站:
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等)的组合: a)读取保存的文件 b)对它运行正则表达式以收集每个单独的信息块(使用'(\ d *?)\ |(。?)\ |(。?)\ |(。*?)\ | “) c)使第一个捕获组等于最后一个捕获组的长度 d)将所有正则表达式匹配保存到新文档或返回原始文档
来自“集体”的任何意见都将非常感激。
答案 0 :(得分:1)
看起来RegEx的单行不会解决这个问题,因为没有办法在{braces}之间放置第一个捕获的括号来表示长度。这是我认为理想的:
(\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;
}
}