`
chenjihua75
  • 浏览: 42652 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

新版truncate_html(不使用hpricot)

阅读更多
参考文献:
http://mikeburnscoder.wordpress.com/2006/11/11/truncating-html-in-ruby/

这里不使用hpricot,而是使用ruby自己带的库rexml中的pullparser
将文件取名为string.rb,并放到rails项目的lib目录下,当然也可以根据需要,改写成helper(我就是这么做的)。
require 'rexml/parsers/pullparser'

class String
  def truncate_html(len = 30)
    p = REXML::Parsers::PullParser.new(self)
    tags = []
    new_len = len
    results = ''
    while p.has_next? && new_len > 0
      p_e = p.pull
      case p_e.event_type
      when :start_element
        tags.push p_e[0]
        results << "<#{tags.last} #{attrs_to_s(p_e[1])}>"
      when :end_element
        results << "</#{tags.pop}>"
      when :text
        results << p_e[0].first(new_len)
        new_len -= p_e[0].length
      else
        results << "<!-- #{p_e.inspect} -->"
      end
    end
    tags.reverse.each do |tag|
      results << "</#{tag}>"
    end
    results
  end

  private

  def attrs_to_s(attrs)
    if attrs.empty?
      ''
    else
      attrs.to_a.map { |attr| %{#{attr[0]}="#{attr[1]}"} }.join(' ')
    end
  end
end

1、首先使用html格式字符串初始化PullParser:
p = REXML::Parsers::PullParser.new(self)

2、然后使用pull函数每次获取一个元素:
e = p.pull

假设字符串为:
str = '<div id="head">some text<h1>head</h1></div>'

那么上面的语句返回一个对象e,其中
e.event_type = :start_element
e[0] = 'div'
e[1] = {"id" => "head"} # 一个保存tag属性的hash

3、再次执行
e = p.pull

那么就会返回一个
e.event_type = :text
的对象。
4、空白和中文字符长度处理
如果要去除字符串的空白,使用:
string.strip

如果要获取包含中文字符的字符串的字符长度(非字节长度),使用:
string.split(//).length

分享到:
评论

相关推荐

    sql之truncate_、delete与drop区别.pdf

    - 如果不关心事务或触发器,使用`TRUNCATE`。 - 如果希望保留事务或触发器,使用`DELETE`。 - **整理表内部碎片**:可以先使用`TRUNCATE`加上`REUSE STORAGE`选项来释放空间,然后再重新导入或插入数据,以此达到...

    Oracle_授权审计表Truncate权限.docx

    create or replace procedure proc_truncate_aud as begin execute immediate 'truncate table sys.aud$'; end; ``` 在创建了存储过程后,需要赋予存储过程的执行权限给相应的用户。例如,可以使用以下语句赋予 ...

    Oracle_审计表_sys.aud$_授权给用户Truncate权限.docx

    - **执行存储过程**:最后,用户可以通过调用存储过程`proc_truncate_aud`来执行截断操作。 ```sql CALL SYS.proc_truncate_aud(); ``` ##### 2. 监控与维护 - **审计表记录统计**:可以使用以下SQL语句来查看...

    前端开源库-truncate-html

    通过使用`truncate-html`,开发者可以更精细地控制内容的显示,确保用户体验不受到影响。 这个库的使用方式通常包括以下步骤: 1. **安装**:首先,你需要通过npm(Node.js包管理器)来安装`truncate-html`。在...

    truncate_header2:从所有文件中删除标题。-matlab开发

    在这个特定的情况下,`truncate_header2.m`使用了*nix(Unix-like)系统的几个命令行工具,这包括: 1. **wc**: "word count",用于统计文件的行数、单词数和字符数。在这里,它可能被用来确定文件的总行数,以便...

    SQL Server中减小Log文件尺寸的方法分享

    需要注意的是,在SQL Server 2008及更高版本中,`TRUNCATE_ONLY`选项在`BACKUP LOG`语句中已被弃用。在这些版本中,你应该先将数据库设置为简单恢复模式,然后使用`DBCC SHRINKFILE`来减小日志文件尺寸。 在日志...

    MySQL删除数据Delete与Truncate语句使用比较

    不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。 其语法结构为: 代码如下:...

    Oracle给用户授权truncatetable的实现方案

    1,对其它用户下的表执行trundate ...SQL&gt; create table Z_TRUNCATE_T(ID number); Table created. SQL&gt; insert into Z_TRUNCATE_T select 1 from dual; 1 row created. SQL&gt; commit; Commit complete. SQL&gt; select

    matlab开发-truncateheader

    `truncate_header.m`是完成这一任务的MATLAB脚本。在这个脚本中,可能包含了读取大文件、定位头部结束位置、以及从文件中删除或跳过头部信息的代码。由于大文件可能无法一次性加载到内存,因此通常会使用逐块读取...

    修改过的cn_truncate函数实现

    以前从网上找到的一个smarty模板的中文截取函数cn_truncate,原来的实现方法有几个bug,我对它基本上重写了一遍。不过实现的功能和思想还是借鉴原来函数的。最重要的是解决了中英文混合时候的截取计算长度的问题。...

    前端开源库-truncate-html.zip

    `truncate-html`是一个专门解决这个问题的前端开源库,它允许开发者在不破坏HTML结构的情况下,智能地截断HTML文本。这个库的核心功能是提供一种方式来控制HTML内容的长度,同时保持内容的可读性和格式完整性。 在`...

    TRUNCATE与 DELETE区别

    对于堆组织的表,如果不使用表锁,DELETE 后的空页可能需要后台进程逐步回收。而对于索引,DELETE 同样会留下空页,但这些空页通常会被更快地回收。 另外,TRUNCATE TABLE 对于标识列(identity column)的影响也是...

    ORACLE truncate 数据恢复

    由于`TRUNCATE`不记录单行删除,所以它在速度上比`DELETE`快很多,且不触发任何与删除相关的触发器或回滚段。然而,这也意味着`TRUNCATE`操作一旦执行,数据就无法通过正常的数据库事务回滚来恢复,这对于初学者来说...

    php截取汉字类

    1. **smarty_modifier_truncate_utf8**: 用于UTF-8编码下的中文字符串截取。 2. **gbk_strlen**: 计算GBK编码下字符串的长度。 3. **gbk_substr**: 在GBK编码下截取字符串。 4. **smarty_modifier_truncate_gbk**: ...

    清空ecshop体验数据的简单方法

    TRUNCATE TABLE `ecs_admin_log`; TRUNCATE TABLE `ecs_article`; TRUNCATE TABLE `ecs_brand`; TRUNCATE TABLE `ecs_comment`; TRUNCATE TABLE `ecs_category`; TRUNCATE TABLE `ecs_goods`; TRUNCATE TABLE `ecs_...

    oracle中truncate table后的数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`是一个用于删除表中所有数据的命令,它与`DELETE`语句不同,不记录任何删除操作,并且在大多数情况下执行速度更快。然而,一旦执行`TRUNCATE TABLE`,数据通常无法通过常规的...

    ZenCart常用SQL命令

    与使用`DELETE FROM`语句相比,`TRUNCATE TABLE`在执行效率上更高,因为它不涉及记录删除日志的操作,而是直接释放已分配的空间。 #### 四、总结 通过上述介绍可以看出,在ZenCart的二次开发过程中,合理使用SQL...

    truncate,delete,drop的异同点

    - **速度快**:由于 `TRUNCATE` 不记录日志信息,因此执行速度非常快。 - **不支持回滚**:由于它属于 DDL 命令,因此无法通过事务回滚来恢复被删除的数据。 - **不触发触发器**:`TRUNCATE` 操作不会触发任何...

Global site tag (gtag.js) - Google Analytics