PHP匹配省略号截取标题内容 移除末尾附带的作者信息
PHP截取省略号前标题正文的实现方案
原有代码失效原因
你之前写的两段测试代码没达到预期,问题出在这几个地方:
- 第一段代码只做了省略号的存在性判断,没有做内容截取,而且正则里的
.是通用通配符,没有转义的情况下匹配逻辑本身就有偏差,不是精准匹配三个点的省略号 - 第二段代码属于函数用法错误:
array_key_exists是用来判断数组的键名是否存在,本身不支持正则匹配,而且按空格拆分字符串的思路从根上就有问题——省略号和前面的单词连写时会被分到同一个数组元素里,根本没法精准定位分割点。
可直接落地的实现方案
不用拆分数组,直接定位省略号的位置做截取就行,同时兼容半角...、全角…两种省略号格式,不管省略号和前面的单词有没有空格都能正常处理。
版本1:字符串定位版(性能更好,无正则兼容问题)
/** * 清理标题,仅保留省略号前的正文内容 * @param string $raw_title 原始带作者的标题 * @return string 处理后的正文标题 */ function trim_title_by_delimiter($raw_title) { // 分别定位两种省略号的首次出现位置 $half_pos = mb_strpos($raw_title, '...'); $full_pos = mb_strpos($raw_title, '…'); $split_pos = null; // 取最早出现的省略号位置作为分割点 if ($half_pos !== false) $split_pos = $half_pos; if ($full_pos !== false) { $split_pos = is_null($split_pos) ? $full_pos : min($split_pos, $full_pos); } // 没匹配到省略号时直接返回原标题(兼容异常格式) if (is_null($split_pos)) return trim($raw_title); // 截取分割点前的内容,去掉末尾多余空格 return trim(mb_substr($raw_title, 0, $split_pos)); }
WordPress场景下直接调用即可:
$origin_title = get_the_title(155571); $final_title = trim_title_by_delimiter($origin_title); // 传入你给出的示例标题,输出结果为:It's no use going back to yesterday, because at that time I was echo $final_title;
版本2:正则匹配版(代码更简洁)
如果你更习惯用正则处理,也可以用这个版本,效果和上面完全一致:
function trim_title_by_regex($raw_title) { // 非贪婪匹配两种省略号,捕获前面的所有正文内容 if (preg_match('/^(.*?)(?:\.{3}|…)/s', $raw_title, $match)) { return trim($match[1]); } return trim($raw_title); }
注意事项
- 写正则匹配半角省略号时,必须把
.转义为\.,否则.会匹配任意单个字符,导致匹配逻辑错误 - 所有字符串处理用
mb_前缀的多字节安全函数,避免中文、全角字符截取时出现乱码 - 代码加了异常兼容:如果标题里没找到省略号,会直接返回原标题,不会出现空内容的问题
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

