在Google表格单元格中删除HTML

5

我将尝试确定在Google Sheets中自动删除某一列中所有单元格中的HTML标记的最佳方法。

单元格数据示例:

<span style="color:#0000FF">test</span>

我希望在每次添加新行时,自动删除所有HTML代码并只保留纯文本。

我不确定是在单元格中使用正则表达式作为公式还是采用某种类型的脚本来实现更好。

3个回答

16
你可以使用REGEXREPLACE函数:
=REGEXREPLACE(A1,"</?\S+[^<>]*>","")

这个公式也可以转换为ArrayFormula:

=ARRAYFORMULA(REGEXREPLACE(offset(A1,,,COUNTA(A:A)),"</?\S+[^<>]*>",""))

这个公式会自动填充。COUNTA(A:A) 是列[A]中包含数据的行数。


由于某种原因,它吃掉了整个字段... <b>我</b>是老师。<div>(<b>我</b>是老师。)</div> 仍在尝试调试... - Brownbat
1
好的,不确定为什么这对我来说是错误的。但是更简单的"<[^<>]+>"对我的情况很有效。打开括号,一些不是尖括号的字符,然后关闭括号。 - Brownbat
@brownbat 谢谢!您可以发布您的答案和解释,为什么它应该有效。 - Max Makhrov

9
你只需要使用查找和替换对话框。
查找内容:</?\S+[^<>]*> 替换为:<空字符串> 搜索:特定范围 = '<SHEET_NAME>'!<COLUMN>:<COLUMN> (例如'Sheet1 的副本'!A:A)
确保勾选了使用正则表达式搜索。然后,单击全部替换
这是一个屏幕截图: enter image description here

感谢您的回复和编辑。不过我正在寻找一种自动化的方法。也就是说,当添加新行时,脚本会运行并检查每个单元格是否包含任何HTML代码,然后将其删除。由于这是更大工作流程的一部分,因此我将更新原始问题,以便更清晰地表示。 - Eddie Padin

4

我喜欢Max Makhrov的方法,但稍微简单一点的正则表达式如下:

"<[^<>]+>"

在这个公式中:
=REGEXREPLACE(A1,"<[^<>]+>","")

如果你回顾一下Max的作品,他包括的其他元素有:

/?

他的意思是第一个字符要么是斜杠(/),要么不是。因为你会看到像"<div>"或"</div>"标签这样的东西,我们想匹配它们两个。
\S+

"

"\S"表示任何非空白字符。"+"表示出现一次或多次。因此,斜杠后面跟着一些可见字符。

然后他有"[^<>]*"——任何非尖括号字符零次或多次,最终找到那个闭合括号。因此,在我们最后一组字符停止后(即,我们遇到空格),然后开始搜索那个闭合括号。

但是斜杠、非空白字符——我们可以直接让"[^<>]"从一开始就为我们完成所有工作。我们可能会使用"+"而不是"*",以确保在标记中至少找到一个字符。(如果您想去除“空”标记,可以将其设为"*"...我不确定什么时候会出现这些情况。)

因此,我的版本在某种意义上更加“愚蠢”。它只是说,让我们不用管是否有斜杠、空格或其他东西,而是只取得两个尖括号之间的任何内容。

您可能会注意到,这修复了Max原始答案中的一个微妙错误,即如果条目和标记中没有任何空格,它将删除整个字段。"\S+"是“贪婪”的。因此,如果您遇到像这样的东西:

"
<b>test1</b><div>test2</div>

"\S"将匹配从第一个“b”到最后一个“div”的每个字符。它不会停下来寻找非括号字符,因为它还没有找到空格。所以您的字段中什么都不会返回。(如果您的标记中有空格,则它看起来有效,这就是为什么它在上面的示例中第一眼起作用的原因。)
如果要使该操作符非贪婪,则必须在其后添加“?”字符,如下所示:
"</?\S+?[^<>]*>"

如果你使用我更简单的版本,即 <[^<>]+>,那么它贪婪匹配会没问题,因为只要它找到下一个尖括号,就会立即停止,而不需要考虑空格。

所以,要么:

=REGEXREPLACE(A1,"<[^<>]+>","")

或者
=ARRAYFORMULA(REGEXREPLACE(offset(A1,,,COUNTA(A:A)),"<[^<>]+>",""))

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接