You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现需求:在第10个单词后插入文本且不进入HTML标签内

解决方案

要实现这个需求,核心是区分HTML标签与文本内容,同时跟踪标签嵌套状态,确保插入操作只在标签外执行。下面以PHP为例给出具体实现:

实现思路

  1. 遍历字符串,拆分出HTML标签和纯文本片段;
  2. 用栈结构跟踪标签嵌套状态(遇到开始标签压栈,结束标签弹栈);
  3. 在纯文本片段中统计单词数,当计数到第10个单词时标记插入点,等待所有嵌套标签闭合后再执行插入。

代码实现

$originalStr = 'Lorem ipsum <strong>dolor sit amet</strong>Aenean fermentum risus <strong><a href="https://google.com">id tortor.</a></strong> <strong>Suspendisse nisl.</strong> dictum at dui. Aenean id metus <strong><a href="https://google.com"> id velit</a>  ullamcorper pulvinar</strong>. Neque porro quisquam es qui dolorem ipsum.';
$insertText = ' read more ';
$targetWordCount = 10;
$currentWordCount = 0;
$insertTriggered = false;
$tagStack = [];
$result = '';

// 正则匹配标签和文本片段(拆分标签/非标签内容)
$pattern = '/(<[^>]+>|[^<]+)/';
preg_match_all($pattern, $originalStr, $matches);

foreach ($matches[0] as $segment) {
    if ($insertTriggered && empty($tagStack)) {
        // 标签栈为空,执行插入
        $result .= $insertText;
        $insertTriggered = false;
    }

    if (str_starts_with($segment, '<')) {
        // 处理HTML标签
        if (str_starts_with($segment, '</')) {
            // 结束标签,弹出栈顶
            array_pop($tagStack);
        } elseif (!str_ends_with($segment, '/>')) {
            // 非自闭合开始标签,压入栈
            $tagName = preg_replace('/<(\w+).*/', '$1', $segment);
            array_push($tagStack, $tagName);
        }
        $result .= $segment;
    } else {
        // 处理纯文本片段,拆分单词计数
        $words = preg_split('/\s+/', trim($segment));
        foreach ($words as $word) {
            if ($word === '') continue;
            $currentWordCount++;
            $result .= $word . ' ';
            if ($currentWordCount === $targetWordCount) {
                $insertTriggered = true;
                break;
            }
        }
        // 若当前片段未到目标单词数,拼接剩余文本
        if ($currentWordCount < $targetWordCount) {
            $remainingWords = array_slice($words, array_search($word, $words) + 1);
            $result .= implode(' ', $remainingWords);
        }
    }
}

// 最后检查:若插入标记已触发且栈为空,补充插入
if ($insertTriggered && empty($tagStack)) {
    $result .= $insertText;
}

// 清理多余空格
$result = preg_replace('/\s+/', ' ', trim($result));
echo $result;

代码说明

  • 正则拆分片段:用/(<[^>]+>|[^<]+)/将字符串拆分为标签和文本两部分,避免直接按空格拆分破坏HTML结构;
  • 标签栈跟踪:通过栈记录当前嵌套的标签,确保插入操作只在所有外层标签闭合后执行;
  • 单词计数逻辑:在纯文本片段中逐个统计单词,达到第10个时触发插入标记,等待标签栈为空后插入指定文本。

运行后,read more会被插入到包裹第10个单词tortor.的外层</strong>标签之后,完全符合需求。

内容的提问来源于stack exchange,提问作者user1049961

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:08:09