Posts Tagged ‘取H’

提取HTML代码中文字的C#函数

星期二, 06月 3rd, 2008

/// <summary>
/// 去除HTML标记
/// </summary>
/// <param name=”strHtml”>包括HTMLde源码 </param>
/// <returns>已经去除后de文字</returns>
public static string StripHTML(string strHtml)
{
string [] aryReg ={
@”<script[^>]*?>.*?</script>”,

@”<(\/\s*)?!?((\w :)?\w )(\w (\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w )|.{0})|\s)*?(\/\s*)?>”,
@”([\r\n])[\s] “,
@”&(quot|#34);”,
@”&(amp|#38);”,
@”&(lt|#60);”,
@”&(gt|#62);”,
@”&(nbsp|#160);”,
@”&(iexcl|#161);”,
@”&(cent|#162);”,
@”&(pound|#163);”,
@”&(copy|#169);”,
@”&#(\d );”,
@”–>”,
@”<!–.*\n”
};

string [] aryRep = {
“”,
“”,
“”,
“\”",
“&”,
“<”,
“>”,
” “,
“\xa1″,//chr(161),
“\xa2″,//chr(162),
“\xa3″,//chr(163),
“\xa9″,//chr(169),
“”,
“\r\n”,
“”
};

string newReg =aryReg[0];
string strOutput=strHtml;
for(int i = 0;i<aryReg.Length;i )
{
Regex regex = new Regex(aryReg[i],RegexOptions.IgnoreCase );
strOutput = regex.Replace(strOutput,aryRep[i]);
}

strOutput.Replace(”<”,”");
strOutput.Replace(”>”,”");
strOutput.Replace(”\r\n”,”");


return strOutput;
}

javamail收取Hotmail的退信

星期一, 06月 2nd, 2008

Hotmail 是我最常用deEmail Client.虽然时下hotmailde容量是小了些,速度也常常慢得让人不禁问候盖茨de母亲.但不可否认,它功能相当丰富,也比较稳定.尤其它de页面设计更是我等web编程人员de重要参照.
  不象很多dePOP3服务器,hotmail 实现了邮件传送状态通知(multipart/report).我以前写de邮件客户端只支持收取 multipart/related、multipart/alternative和multipart/mixed 等多媒体类型de邮件,其他de因为不常见,我都忽略了.
  客户不答应了,那还有什么好说de,还有什么比让客户满意更重要de事情呢,在没买单之前.
  multipart/report 邮件类型de介绍参见 RFC1892,Sunde中文 Javamail Faq 里也有相关de说明,我摘录如下:
  问. 当消息不能被传送时,就会返回一个失败消息.我如何检测这些“回弹”消息?
  答:虽然有一个 Internet 标准用于报告这样de错误(multipart/report MIME 类型,参阅 RFC1892),但还没有广泛实现它.RFC1211 深入讨论了这个问题,包括了大量de例子.
  在 Internet 电子邮件中,特定de邮箱或用户名是否存在,只能由传送消息de最终服务器决定.消息可能通过几个中继服务器(它们不能检测错误),然后再到达最终服务器.通常,当最终服务器检测到这一错误,它会返回一个消息给原始消息de发送人,指出失败de原因.有许多 Internet 标准讨论了这种传送状态通知 (Delivery Status Notifications),但大量服务器不支持这些新标准,相反使用特别技术来返回这种错误消息.这使得将“回弹”消息与产生问题de原始消息相互关联起来非常困难(注意,这个问题与 JavaMail 完全无关).
  有许多技术和试探法用于处理这一问题,但它们都不是完美de.一种技术是 Variable Envelope Return Paths,http://cr.yp.to/proto/verp.txt 描述了这一技术.
  我修改了程序,也只是作了些简单de处理,相关代码如下:
  private void parseMultipart(Multipart multipart) throws Exception {
  for (int i = 0, n = multipart.getCount(); i < n; i ) {
  BodyPart part = multipart.getBodyPart(i);
  String disposition = part.getDisposition();
  if (part.isMimeType(”multipart/*”)) {
   this.parseMultipart((Multipart) part.getContent());
  } else if (part.isMimeType(”text/html”)) {
  //处理文本内容
  }
  /******* 处理附件,图片等等 ********/
  } else if (part.isMimeType(”message/delivery-status”)) {
   part.setFileName(”details.txt”); //仿照outlook,details.txt 内容即传送状态通知de邮件头信息
   saveAttachedFile(part);
  } else if (part.isMimeType(”message/rfc822″)) {
   MimeBodyPart mbp = new MimeBodyPart(part.getInputStream());
   part.setFileName(mbp.getHeader(”Subject”, null) “.eml”); //仿照outlook,用退件de标题做文件名
   saveAttachedFile(part);
  }
  }
  }

  如果要做得更友好,还可以做很多改进,比如根据退信找出已发送文件夹中de原件,或者激发一个通知事件等等.客户并不需要,我还是不要自作多情了.
  大家都知道,hotmail 不是用pop3协议收信,而是用webdav协议.用java收发 hotmail de邮件 ,参见《通过JavaMail访问Hotmail邮箱》.

五、读取HTTP请求头

星期一, 06月 2nd, 2008

5.1 HTTP请求头概述
   HTTP客户程序(例如浏览器),向服务器发送请求de时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他de请求头.大多数请求头并不是必需de,但Content-Length除外.对于POST请求来说Content-Length必须出现.
   下面是一些最常见de请求头:
Accept:浏览器可接受deMIME类型.
Accept-Charset:浏览器可接受de字符集.
Accept-Encoding:浏览器能够进行解码de数据编码方式,比如gzip.Servlet能够向支持gzipde浏览器返回经gzip编码deHTML页面.许多情形下这可以减少5到10倍de下载时间.
Accept-Language:浏览器所希望de语言种类,当服务器能够提供一种以上de语言版本时要用到.
Authorization:授权信息,通常出现在对服务器发送deWWW-Authenticate头de应答中.
Connection:表示是否需要持久连接.如果Servlet看到这里de值为“Keep-Alive”,或者看到请求使用de是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接de优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要de时间.要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单de实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它de大小.
Content-Length:表示请求消息正文de长度.
Cookie:这是最重要de请求头信息之一,参见后面《Cookie处理》一章中de讨论.
From:请求发送者deemail地址,由一些特殊deWeb客户程序使用,浏览器不会用到它.
Host:初始URL中de主机和端口.
If-Modified-Since:只有当所请求de内容在指定de日期之后又经过修改才返回它,否则返回304“Not Modified”应答.
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后de文档,即使它是代理服务器而且已经有了页面de本地拷贝.
Referer:包含一个URL,用户从该URL代表de页面出发访问当前请求de页面.
User-Agent:浏览器类型,如果Servlet返回de内容与浏览器类型有关则该值非常有用.
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本deIE浏览器所发送de非标准de请求头,表示屏幕大小、颜色深度、操作系统和CPU类型.
   有关HTTP头完整、详细de说明,请参见http://www.w3.org/Protocols/deHTTP规范.
   5.2 在Servlet中读取请求头
   在Servlet中读取HTTP头是非常方便de,只需要调用一下HttpServletRequestdegetHeader方法即可.如果客户请求中提供了指定de头信息,getHeader返回对应de字符串;否则,返回null.部分头信息经常要用到,它们有专用de访问方法:getCookies方法返回Cookie头de内容,经解析后存放在Cookie对象de数组中,请参见后面有关Cookie章节de讨论;getAuthType和getRemoteUser方法分别读取Authorization头中de一部分内容;getDateHeader和getIntHeader方法读取指定de头,然后返回日期值或整数值.
   除了读取指定de头之外,利用getHeaderNames还可以得到请求中所有头名字de一个Enumeration对象.
   最后,除了查看请求头信息之外,我还可以从请求主命令行获得一些信息.getMethod方法返回请求方法,请求方法通常是GET或者POST,但也有可能是HEAD、PUT或者DELETE.getRequestURI方法返回URI(URI是URLde从主机和端口之后到表单数据之前de那一部分).getRequestProtocol返回请求命令de第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”.
   5.3 实例:输出所有de请求头
   下面deServlet实例把所有接收到de请求头和它de值以表格de形式输出.另外,该Servlet还会输出主请求命令de三个部分:请求方法,URI,协议/版本.
   ShowRequestHeaders.java
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowRequestHeaders extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "显示所有请求头";
out.println(ServletUtilities.headWithTitle(title)
"<BODY BGCOLOR=\"#FDF5E6\">\n"
"<H1 ALIGN=CENTER>" title "</H1>\n"
"<B>Request Method: </B>"
request.getMethod() "<BR>\n"
"<B>Request URI: </B>"
request.getRequestURI() "<BR>\n"
"<B>Request Protocol: </B>"
request.getProtocol() "<BR><BR>\n"
"<TABLE BORDER=1 ALIGN=CENTER>\n"
"<TR BGCOLOR=\"#FFAD00\">\n"
"<TH>Header Name<TH>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.println("<TR><TD>" headerName);
out.println(" <TD>" request.getHeader(headerName));
}
out.println("</TABLE>\n</BODY></HTML>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

提取HTML标签

星期一, 06月 2nd, 2008

<?php
/*********************************
*
* 作者: 徐祖宁 (唠叨)
* 邮箱: czjsz_ah@stats.gov.cn
* 开发: 2002.07
*
*
* 函数: tags
* 功能: 从文件中提取HTML标签
*
* 入口:
* $filename 文件名
* $tag 标签名
* 返回:
* 数组,每项为:
* tagName String
* Text String
* Attrs Array
*
* 示例:
* print_r(tags("test1.htm","a"));
* print_r("http://localhost/index.htm","img");
*
*/
function tags($filename,$tag) {
$buffer = join("",file($filename));
$buffer = eregi_replace("\r\n","",$buffer);
$tagkey = sql_regcase($tag);
$buffer = eregi_replace("<$tagkey ","\n<$tag ",$buffer);
$ar = split("\n",$buffer);
foreach($ar as $v) {
if(! eregi("<$tagkey ",$v)) continue;
eregi("<$tagkey ([^>]*)((.*)</$tagkey)?",$v,$regs);
$p[tagName] = strtoupper($tag);
if($regs[3])
$p[Text] = $regs[3];
$s = trim(eregi_replace("[ \t] "," ",$regs[1]))." ";
$s = eregi_replace(" *= *","=",$s);
$a = split(" ",$s);
for($i=0;$i<count($a);$i ) {
$ch = array();
if(eregi("=[\"']",$a[$i])) {
$j = $i 1;
while(!eregi("[\"']$",$a[$i])) {
$a[$i] .= " ".$a[$j];
unset($a[$j]);
}
}
}
foreach($a as $k) {
$name = strtoupper(strtok($k,"="));
$value = strtok("\0");
if(eregi("^[\"']",$value))
$value = substr($value,1,-1);
if($name)
$p[Attrs][$name] = $value;
}
$pp[] = $p;
}
return $pp;
}
?>