拓展示例

04-13Ctrl+D 收藏本站

关灯 直达底部

Additional Examples

为Image Tag添加宽度和高度属性

Adding Width and Height Attributes to Image Tags

这里给出个高级的例子,原地(in-place)查找替换,修改HTML,保证所有的image tag都包含WIDTH和HEIGHT属性(HTML必须是StringBuilder、StringBuffer,或者其他CharSequence)。

只要有一副图像没有规定宽度或者高度,就可能降低整个页面的装载速度,因为浏览器在显示这幅图像之前必须读入整个文件。如果包含了宽度和高度的尺寸,文本和其他元素就可以立刻正确摆放,这样用户会感觉页面读取速度更快(注8)。

如果找到image tag,程序会寻找SRC、WIDTH和HEIGHT属性,如果存在,提取他们的值。如果WIDTH和HEIGHT有一个不存在,就先取回图像,计算尺寸,然后补充上属性。如果WIDTH和HEIGHT都没有,就按照图像的真实尺寸来设置这些属性。如果存在一个,就只需要算出另一个属性,它的值是按比例计算出来的(例如,如果WIDTH是真实尺寸的一半,则添加的HEIGHT的值也是真实高度的一半;现代的浏览器就是这样处理的)。和第383页的代码一样,这个程序手动维护匹配指针。它还使用了检索范围(☞384)和方法链(☞389)。代码如下:

尽管这例子很有教育意义,但还是有少数地方没考虑到。因为这个例子的重点在于本地查找和替换,尽可能地简化了其他方面,对需要处理的HTML进行了理想的假设。例如,正则表达式不容许属性的等号两边出现空白,属性中不会出现引号(参考第202页的Perl正则表达式,可以得到有实际意义的,Java版本的tag属性匹配的办法)。这个程序不能处理相对URL,也不能处理格式错误的URL,也不能处理获取图像的代码抛出的任何异常。

不过,这个例子仍然说明了几个重要的概念。

对于每个Matcher,使用多个Pattern校验HTML

Validating HTML with Multiple Patterns Per Matcher

我们也可以用Java来写校验简单HTML的程序(☞132)。这段代码通过usePattern方法实时更换Matcher的pattern。这样能够处理多个以「\G」开头的pattern,进行对应的操作。请参考第132页的内容了解此方法的更多细节。

因为java.util.regex的bug,非HTML的匹配尝试即使不成功,仍然会“占用”目标字符串中的一个字符,所以我把这段程序放在最后。这个 bug 仍然存在,只是表现为错误输出中缺少第一个字符。我已经把这个bug提交给Sun。

此bug没有修正之前,该如何使用单个参数的find方法来解决此问题呢?ϖ 请翻到下页查看答案。

解析CSV文档

Parsing Comma-Separated Values (CSV) Text

这里是用 java.util.regex写的解析CSV 的例子(参见第6 章☞271)。这里的程序使用占有优先量词(☞142)取代固化分组,因为这样看起来更清楚。

这个程序比第217页的原始程序效率要高很多,原因在于:正则表达式效率更高,按照第6章第271页介绍的办法,重复使用单个Matcher(通过单个参数版本的reset方法),而没有不断创建-回收Mather。