从Postgres的字符串列中删除base64值

时间:2019-03-05 16:53:40

标签: sql postgresql base64

我在表中有一个文本列,其中包含HTML数据以及以base64编码表示的图像。

这里是一个例子:

</p><p><span lang="EN">&nbsp;</span></p><p>
</p><p><img width="263" height="135" align="right" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEAYABgAA...." alt=""></p>

base64之后的字符串非常长。我要删除长字符串表示形式,并替换为“图像”一词。

我在base64,上进行了模式匹配,然后删除了所有内容,直到"关键字之前的alt标记为止。它适用于仅出现base64值的情况。如果出现多次,则失败。

是否有更好的方法来解决此问题,以便仅删除以base64编码表示图像的字符串?

2 个答案:

答案 0 :(得分:0)

也许您的问题是贪婪匹配,而解决方案是匹配"字符以外的任何字符:

regexp_replace(col, 'base64,[^"]*', 'image')

答案 1 :(得分:0)

要使实际替换工作不止一次,您需要为regexp_replace使用“全局”标志,例如:

=# SELECT regexp_replace(E'\n\n...height="135" align="right" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEAYABgAA...." alt="" ...\n<p></p>\n<p><img align="left" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEAYABgAA...." class="test" alt=""/>\n', '(data:[^,]+,)[^"]+', '\1<data>', 'g');
                                regexp_replace                                
------------------------------------------------------------------------------
                                                                             +
                                                                             +
 ...height="135" align="right" src="data:image/png;base64,<data>" alt="" ...  +
 <p></p>                                                                     +
 <p><img align="left" src="data:image/png;base64,<data>" class="test" alt=""/>+

(1 row)

...所以:regexp_replace(my_html_column, '(data:[^,]+,)[^"]+', '\1<data>', 'g')

应该匹配并替换给定文本的所有data URI