ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CodeIgniter Text Helper 完全指南:文本截断、内容过滤、代码高亮与字符转写实战

CodeIgniter Text Helper 完全指南:文本截断、内容过滤、代码高亮与字符转写实战 CodeIgniter Text Helper 完全指南文本截断、内容过滤、代码高亮与字符转写实战【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter本文围绕 CodeIgniter 框架的 Text Helper文本助手展开系统讲解其在文章摘要截取、评论内容净化、URL 友好化、代码展示与文本排版等典型场景中的应用。Text Helper 的核心文件位于 system/helpers/text_helper.php对应的官方文档为 user_guide_src/source/helpers/text_helper.rst并配有完整的单元测试 tests/codeigniter/helpers/text_helper_test.php。读完本文你将掌握 Text Helper 的全部 10 个函数参数含义、默认值、返回值类型、实际输出示例以及背后的源码实现原理能够直接在自己的控制器、模型或视图中落地使用。加载 Text HelperText Helper 不属于默认加载的助手使用前必须显式加载。在控制器或模型中调用$this-load-helper(text);之后即可在全局命名空间直接调用word_limiter()、character_limiter()等所有 Text Helper 函数。加载过程由 system/core/Loader.php 中的helper()方法完成它会把传入的名称规范化为xxx_helper形式自动追加_helper后缀先在application/helpers/中查找扩展或覆盖版本扩展名前缀由配置项subclass_prefix决定再回落到system/helpers/加载基础实现并记录到已加载清单以避免重复加载。因此你完全可以在application/helpers/下放置同名的text_helper.php来覆盖或扩展框架默认函数加载机制会自动优先采用应用层的实现。函数总览Text Helper 共提供 10 个函数覆盖文本处理的五大类需求分类函数用途截断word_limiter()按单词数截断字符串截断character_limiter()按字符数截断并保持单词完整截断ellipsize()精确控制长度并在任意位置插入省略号字符转码ascii_to_entities()将 ASCII / 高 ASCII 字符转为 HTML 实体字符转码entities_to_ascii()将 HTML 实体还原为 ASCII 字符字符转码convert_accented_characters()将带重音的外文字符转写为纯 ASCII内容过滤word_censor()审查并屏蔽敏感词高亮highlight_code()为 PHP / HTML 代码着色高亮highlight_phrase()高亮文本中的指定短语排版word_wrap()按字符数换行并保持单词完整下面逐一展开每个函数都给出参数签名、默认值、官方示例、测试用例与源码实现要点。按单词数截断word_limiter()函数签名word_limiter($str, $limit 100, $end_char #8230;)$str输入字符串$limit保留的单词数默认 100$end_char追加在末尾的后缀默认是省略号实体#8230;即 …。官方示例$string Here is a nice text string consisting of eleven words.; $string word_limiter($string, 4); // Returns: Here is a nice测试用例 text_helper_test.php 进一步验证了自定义后缀与空串的边界行为$this-assertEquals(Once upon a time,#8230;, word_limiter($long_string, 4)); $this-assertEquals(Once upon a time,hellip;, word_limiter($long_string, 4, hellip;)); $this-assertEquals(, word_limiter(, 4));源码实现text_helper.php有两个值得注意的细节如果trim($str)后为空字符串直接原样返回通过正则/^\s*(?:\S\s*){1,.(int) $limit.}/匹配前 N 个单词若匹配结果与原始字符串等长说明字符串本就不足 N 个词此时会清空$end_char避免画蛇添足地追加省略号。这一函数非常适合用于生成新闻列表、博客摘要中的“前 N 词预览”。按字符数截断character_limiter()函数签名character_limiter($str, $n 500, $end_char #8230;)$str输入字符串$n目标字符数默认 500$end_char追加的省略号后缀默认#8230;。它与word_limiter的关键区别在于以字符数为准但会保持单词的完整性因此最终字符数可能比指定值略多或略少。官方示例$string Here is a nice text string consisting of eleven words.; $string character_limiter($string, 20); // Returns: Here is a nice text string测试验证text_helper_test.php$this-assertEquals(Once upon a time, a#8230;, character_limiter($long_string, 20)); $this-assertEquals(Short, character_limiter(Short, 20)); // 短串原样返回 $this-assertEquals(Short, character_limiter(Short, 5)); // 即使 n 等于长度也原样返回实现要点text_helper.php全程使用mb_strlen()按字符而非字节计数天然支持 UTF-8 等多字节编码先把换行、制表符、垂直制表符、换页符等统一替换为空格并合并连续空格避免因空白符干扰单词边界然后按空格explode逐词拼接累计长度达到$n时即返回并在长度未耗尽原串时追加$end_char。官方文档特别提示如果需要精确到指定字符数不保留单词完整性请改用下方介绍的ellipsize()。HTML 实体与 ASCII 互转ascii_to_entities() / entities_to_ascii()ascii_to_entities()函数签名ascii_to_entities($str)将 ASCII 值包括高 ASCII 与 MS Word 中的特殊字符如弯引号、破折号转换为 HTML 字符实体。这样无论在何种浏览器设置或字符集环境下字符都能被一致地显示也能被可靠地存入数据库。$string ascii_to_entities($string);测试中给出了明确的输入输出对照text_helper_test.php“‘ “test” #8220;#8216; #8220;test#8221; †¥¨ˆøåß∂ƒ©˙∆˚¬ #8224;#165;#168;#710;#248;#229;#223;#8706;#402;#169;#729;#8710;#730;#172;实现原理text_helper.php逐字节读取字符串对 128的普通 ASCII 字符原样输出对高位字符则按 UTF-8 的 2 字节 / 3 字节序列规则依据首字节是否小于 224 判断重组为对应的 Unicode 码点输出为#数字;形式的实体。entities_to_ascii()函数签名entities_to_ascii($str, $all TRUE)$str输入字符串$all是否同时转换不安全的实体默认TRUE。它是ascii_to_entities()的逆操作把#数字;实体还原为字符当$all为TRUE时还会额外把amp;、lt;、gt;、quot;、apos;、#45;分别还原为、、、、、-见 text_helper.php。从源码看 128的实体直接chr()还原 2048的按两字节 UTF-8 编码还原更大的按三字节还原。实际开发中这对函数常用于从数据库读取富文本时统一实体或把用户粘贴的 Word 文本中的“智能引号”规范化后再入库。重音字符转写convert_accented_characters()函数签名convert_accented_characters($str)将高 ASCII 的外文字符转写为等价的标准 ASCII。官方文档明确指出其典型应用场景当非英语字符需要用在只允许标准 ASCII 的环境例如 URL中时。$string convert_accented_characters($string);测试验证text_helper_test.php$this-assertEquals(AAAeEEEIIOOEUUUeY, convert_accented_characters(ÀÂÄÈÊËÎÏÔŒÙÛÜŸ)); $this-assertEquals(a e i o u n ue, convert_accented_characters(á é í ó ú ñ ü));依赖 foreign_chars.php 配置文件该函数的转写规则并非硬编码在 helper 内而是来自一个伴随配置文件 application/config/foreign_chars.php。文件定义了一个$foreign_characters关联数组键是匹配重音字符的正则表达式值是对应的 ASCII 转写。例如$foreign_characters array( /ä|æ|ǽ/ ae, /ö|œ/ oe, /ü/ ue, /ß/ ss, /ñ|ń|ņ|ň|ʼn|ν|н/ n, // ... 覆盖拉丁语系、希腊语系、西里尔语系等数百个字符 );该配置涵盖了拉丁扩展、希腊字母如/Θ/ TH、/θ/ th、西里尔字母如/Ж/ Zh、/Ю/ Yu以及德语的ß ss、æ ae等常见转写。从实现看text_helper.phpconvert_accented_characters()使用static变量缓存配置数组进程内只加载一次加载顺序为先application/config/foreign_chars.php再按环境覆盖application/config/{ENVIRONMENT}/foreign_chars.php随后调用preg_replace($array_from, $array_to, $str)一次性完成全部替换。若配置为空或缺失则直接返回原字符串。因此自定义转写规则只需编辑 application/config/foreign_chars.php 即可无需改动框架代码。该函数可配合url_title()等 URL 辅助函数将带重音的文章标题转换为干净的拼音/罗马字母 slug。敏感词过滤word_censor()函数签名word_censor($str, $censored, $replacement )$str原始字符串$censored禁止出现的词数组$replacement替换值不指定时默认用####与敏感词等长的#号替换。官方示例$disallowed array(darn, shucks, golly, phooey); $string word_censor($string, $disallowed, Beep!);测试用例验证了“只替换完整单词、不误伤包含该词的其它词”的行为text_helper_test.php$censored array(boob, nerd, ass, fart); Ted bobbled the ball Ted bobbled the ball, // bobble 不受影响 Jake is a nerdo Jake is a nerdo, // nerdo 不受影响 The borg will assimilate you The borg will assimilate you, Did Mary Fart? Did Mary $*#?, // 不区分大小写 Jake is really a boob Jake is really a $*#实现要点text_helper.php若$censored不是数组直接原样返回在字符串首尾各补一个空格并用一个“定界字符类”[-_\(){}[]|!?#%,.:;^~*/ 0-9\n\r\t]界定词的边界。注释中解释了原因\b等正则边界在 Unicode 字符集下不匹配例如über这样的词无法用\b 判断边界因此改用显式定界符集合支持在敏感词中使用通配符*会先被转换为\w*?如f*ck可匹配fuck、freak等有替换值时使用preg_replace大小写不敏感替换无替换值时从后往前用substr_replace把敏感词替换为等长的#号保证####的长度与原文一致。该函数可直接用于评论、留言、聊天内容的实时净化。代码高亮highlight_code()函数签名highlight_code($str)为一段代码字符串PHP、HTML 等着色输出带内联颜色样式的 HTML。示例$string highlight_code($string);官方文档特别说明该函数基于 PHP 原生的highlight_string()实现颜色方案由 php.ini 中的配置决定如highlight.string、highlight.comment等。测试用例展示了其典型输出结构text_helper_test.php$expect codespan style\color: #000000\\nspan style\color: #0000BB\lt;?phpnbsp;var_dump/span...; $this-assertEquals($expect, highlight_code(?php var_dump($this); ?));实现细节text_helper.php包含三步精妙处理预替换把lt;、gt;、?、?、%、%、反斜杠、/script等会干扰高亮或破坏上下文的字符临时替换为phptagopen、phptagclose等安全标记调用highlight_string(?php .$str. ?, TRUE)完成着色返回模式再通过三条正则把人为包裹的 PHP 标签及其着色痕迹剥离还原标记把占位标记替换回原始的lt;?、?gt;、lt;%、lt;/scriptgt;等转义形式保证输出是安全的 HTML。最终输出被包裹在code标签内可直接嵌入页面展示代码片段。短语高亮highlight_phrase()函数签名highlight_phrase($str, $phrase, $tag_open mark, $tag_close /mark)$str原始字符串$phrase要高亮的短语$tag_open/$tag_close包裹短语的起始 / 结束 HTML 标签默认分别为mark与/mark。官方示例$string Here is a nice text string about nothing in particular.; echo highlight_phrase($string, nice text, span stylecolor:#990000;, /span); // 输出 // Here is a span stylecolor:#990000;nice text/span string about nothing in particular.测试验证了不区分大小写、空串安全等行为text_helper_test.phpthis is a phrase markthis is/mark a phrase, Or tell me what this is Or tell me what markthis is/mark, $this-assertEquals(strongthis is/strong a strong test, highlight_phrase(this is a strong test, this is, strong, /strong));实现text_helper.php通过preg_quote转义短语后执行大小写不敏感的preg_replace并在UTF8_ENABLED为真时追加u修饰符以支持 UTF-8 匹配字符串或短语为空时直接原样返回。官方文档还附带一条兼容性提醒旧版本默认使用strong标签而 HTML5 的mark在较老的浏览器中可能不被支持。如需兼容这类浏览器可在样式表中加入mark { background: #ff0; color: #000; }文本自动换行word_wrap()函数签名word_wrap($str, $charlim 76)$str输入字符串$charlim每行最大字符数默认 76。按指定字符数换行同时保持单词完整超长单词会被强制截断但 URL 除外。官方示例$string Here is a simple string of text that will help us demonstrate this function.; echo word_wrap($string, 25); // 输出 // Here is a simple string // of text that will help us // demonstrate this // function.测试从换行符数量与默认行宽两个维度验证text_helper_test.php$this-assertEquals(substr_count(word_wrap($string, 25), \n), 4); $this-assertEquals(strpos(word_wrap($string), \n), 73); // 默认 charlim 76首个换行出现在第 73 个字符后实现要点text_helper.php合并连续空格并把\r\n、\r统一规范化为\n支持{unwrap}/{/unwrap}保护标记被这对标记包裹的内容在换行前被抽出并替换为占位符换行结束后再还原即“不可换行区”先调用 PHP 原生wordwrap()cut FALSE不硬切单词再逐行检查若某行仍超长说明存在单个超长词此时若该行包含 URL匹配://、www.或[url...]则跳过不拆否则按charlim - 1步长用mb_substr强制拆分全流程使用mb_strlen/mb_substr兼容多字节编码。这一函数适用于纯文本邮件、终端输出、固定宽度的文本排版等场景。精确省略号定位ellipsize()函数签名ellipsize($str, $max_length, $position 1, $ellipsis hellip;)$str输入字符串$max_length最终字符串的最大长度$position省略号出现的位置取值 01 之间的整数或小数表示从左到右的比例1 最右端0.5 正中间0 最左端$ellipsis省略号字符默认hellip;。该函数会先剥除 HTML 标签再按最大长度切分并插入省略号因此它是需要“精确字符数”时的首选官方文档在character_limiter()一节末尾明确指引到此函数。官方示例$str this_string_is_entirely_too_long_and_might_break_my_design.jpg; echo ellipsize($str, 32, .5); // 输出 // this_string_is_ehellip;ak_my_design.jpg测试用例覆盖了 0、0.5、1 三种位置以及短字符串的完整矩阵text_helper_test.php// position 0省略号在最左 this is my string hellip; my string, short short // 长度不足时不处理 // position .5省略号在中间 this is my string this hellip;tring, // position 1省略号在最右 this is my string this is myhellip;,实现text_helper.php先用strip_tagstrim清理字符串长度不足$max_length时直接返回随后用floor($max_length * $position)计算前缀长度通过mb_substr分别截取前缀与后缀最后拼接$beg . $ellipsis . $end。位置超过 1 时会被钳制为 1。这一函数特别适合文件名、长标题、长 URL 在固定宽度 UI如表格列、面包屑、卡片中的优雅展示。源码级总结一表掌握全部签名以下为从 system/helpers/text_helper.php 中提取的完整函数签名与默认值速查表函数完整签名含默认值返回类型word_limiterword_limiter($str, $limit 100, $end_char #8230;)stringcharacter_limitercharacter_limiter($str, $n 500, $end_char #8230;)stringascii_to_entitiesascii_to_entities($str)stringentities_to_asciientities_to_ascii($str, $all TRUE)stringconvert_accented_charactersconvert_accented_characters($str)stringword_censorword_censor($str, $censored, $replacement )stringhighlight_codehighlight_code($str)stringhighlight_phrasehighlight_phrase($str, $phrase, $tag_open mark, $tag_close /mark)stringword_wrapword_wrap($str, $charlim 76)stringellipsizeellipsize($str, $max_length, $position 1, $ellipsis hellip;)string补充两个工程层面的要点编码兼容性character_limiter()、word_wrap()、ellipsize()等函数内部使用mb_strlen()/mb_substr()对 UTF-8 中文等多字节文本同样适用ascii_to_entities()则会根据MB_OVERLOAD_STRING常量自动选择按字节还是按字符遍历。可测试性仓库在 tests/codeigniter/helpers/text_helper_test.php 中对全部 10 个函数提供了断言级的测试覆盖含边界条件、多字节字符与自定义参数可作为理解函数行为的第一手参考。组合实战一个完整的文本处理管线将上述函数组合可以轻松构建一个面向社区内容的文本处理管线。例如在评论或文章发布前$this-load-helper(text); $raw Über café — “smart quotes” scriptalert(1)/script ...; // 1. 转写重音字符得到干净 ASCII用于生成 URL slug $slug_friendly convert_accented_characters($raw); // 2. 过滤敏感词 $cleaned word_censor($raw, array(darn, shucks), ***); // 3. 高亮关键词方便用户定位 $highlighted highlight_phrase($raw, café, mark, /mark); // 4. 生成精确长度的摘要 $summary ellipsize(strip_tags($raw), 50, 1); // 5. 列表页展示前 N 词摘要 $teaser word_limiter($raw, 20);通过上述组合即可在不引入第三方库的情况下完成“字符净化 → 转写 → 摘要 → 展示”的完整链路如需调整重音字符的转写规则只需维护 application/config/foreign_chars.php 一个文件。综上Text Helper 以极简的 API 覆盖了 Web 开发中最常见的文本处理需求配合 system/core/Loader.php 的加载机制与可覆盖的应用层实现既开箱即用又保留了充分的定制空间。【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表