PHP实现需求:在第10个单词后插入文本且不进入HTML标签内
解决方案
要实现这个需求,核心是区分HTML标签与文本内容,同时跟踪标签嵌套状态,确保插入操作只在标签外执行。下面以PHP为例给出具体实现:
实现思路
- 遍历字符串,拆分出HTML标签和纯文本片段;
- 用栈结构跟踪标签嵌套状态(遇到开始标签压栈,结束标签弹栈);
- 在纯文本片段中统计单词数,当计数到第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
相关产品推荐
相关产品推荐

