-1

我有一张像下面这样的表格

Table_Name

id   Column_Desc
1    <p><img src="images/abc.png" alt=""/></p>

我想从此列中获取此 src“imageUrl”
实际上我想在删除数据时使用此 src
我想从服务器中删除图像,
我需要一种方法如何从列中获取此路径

4

3 回答 3

1

您可以使用字符串函数的尴尬组合从列中提取图像 URL:

select substring(
        html,
        charindex('<img src="',html)+10,
        charindex(
           '"',
           html,
           charindex('<img src="',html) + 10
        ) -
        charindex('<img src="',html) - 10
    )
    from foo;

在此处查看一个有效的 SQLFiddle 示例

它标记<img src="字符串中第一次出现的开始,并在开始之后的第一次出现结束"。这些是简化的假设,不适用于所有可能的有效 HTML 输入。但它应该在合理的输入上起作用。

更新 2:这可以通过递归查询来扩展以查找所有 URL:

还更新以处理没有图像 url 的情况

with all_img_urls as (
   select id,
        cast(null as char(1000)) as url,
        html
    from foo
    where charindex('<img src="',html) > 0
    union all
   select id,
       cast(substring(
        html,
        charindex('<img src="',html)+10,
        charindex(
           '"',
           html,
           charindex('<img src="',html) + 10
        ) -
        charindex('<img src="',html) - 10
    ) as char(1000)) as url,
    cast(substring(
        html,charindex('"',html,charindex('<img src="',html) + 10),1000
    ) as char(1000)) as html
    from all_img_urls
    where charindex('<img src="',html) > 0
)
select id,url from all_img_urls where url is not null;

更新了 SQLFiddle

这有点乱,但它有效。基本思想是找到第一个图像 url,然后在该图像 url 结束后再次执行搜索。

如果你需要做得更好,你可能不应该尝试在 SQL 中处理它;而是使用可以解析 HTML 的编程语言。

于 2013-04-04T13:11:59.590 回答
0
public List<String> FetchLinksFromSource(string htmlSource)
    {
    List<String> links = new List<String>();
    string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
    MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    foreach (Match m in matchesImgSrc)
    {
        string href = m.Groups[1].Value;
        links.Add(href);
    }
    foreach (string s in links)
    {
        string FilePath = Server.MapPath("~/");
        FilePath += s;
        if (File.Exists(FilePath))
       {
           File.Delete(FilePath);
       }
        FilePath = "";
    }
    return links;
}

谢谢你们所有人......我已经用这个逻辑实现了我的目标

于 2013-04-05T11:26:50.520 回答
0

我认为您所追求的是以下内容:

delete from "Table_Name" where "Column_Desc" like '%images/abc.png%'

我认为这会给你你想要的,虽然我会用

select "Column_Desc" from "Table_Name" where "Column_Desc" like '%images/abc.png%'

首先确保它只返回你想要的。

于 2013-04-04T12:58:38.693 回答