如何实现PHP字符串移除HTML标签后还原至原位置(适配DeepL翻译)
解决方案:移除HTML标签翻译后还原原位置
核心思路
先提取并记录HTML标签在原字符串中的位置与内容,移除标签后翻译纯文本,最后将标签精准插回对应位置。
具体实现步骤
步骤1:提取标签与纯文本
用正则或HTML解析工具捕获所有带属性的HTML标签,同时剥离标签得到纯文本。以Python为例,用re模块实现:import re original_str = "<div id='content'>Hi <i>there</i>, this is a <span class='highlight'>test</span>.</div>" tag_records = [] # 匹配所有HTML标签并记录位置 for match in re.finditer(r'<[^>]+>', original_str): tag_records.append({ "content": match.group(), "start_pos": match.start(), "end_pos": match.end() }) # 生成无标签的纯文本 plain_text = re.sub(r'<[^>]+>', '', original_str)若处理复杂嵌套HTML,推荐用
BeautifulSoup解析节点,避免正则的局限性。步骤2:调用DeepL翻译纯文本
用DeepL API翻译剥离后的纯文本:import deepl translator = deepl.Translator("你的API密钥") translated_plain = translator.translate_text(plain_text, target_lang="ZH")步骤3:还原HTML标签
按原标签的出现顺序,将标签插入翻译后的文本对应位置。需注意翻译后文本长度变化,通过原文本的文本片段与翻译后片段的对应关系来定位:# 拆分原文本为「文本片段+标签」的交替序列 segments = [] last_idx = 0 for tag in tag_records: if last_idx < tag["start_pos"]: segments.append(("text", original_str[last_idx:tag["start_pos"]])) segments.append(("tag", tag["content"])) last_idx = tag["end_pos"] if last_idx < len(original_str): segments.append(("text", original_str[last_idx:])) # 提取原文本片段,拆分翻译后的文本为对应片段 original_text_parts = [seg[1] for seg in segments if seg[0] == "text"] translated_parts = translated_plain.text.split() # 可根据语义优化拆分逻辑 # 拼接标签与翻译后的文本 final_result = [] text_part_idx = 0 for seg in segments: if seg[0] == "tag": final_result.append(seg[1]) else: final_result.append(translated_parts[text_part_idx]) text_part_idx += 1 final_str = " ".join(final_result)
关键注意事项
- 处理嵌套标签时,用HTML解析库(如
BeautifulSoup)遍历节点比正则更可靠,能避免标签匹配错误。 - 翻译后文本的片段拆分需适配语言特性,比如中文无空格分隔,可通过原文本的标点、语义断点来对齐片段。
内容的提问来源于stack exchange,提问作者Miguel Gisbert
相关产品推荐
相关产品推荐

