获取匹配字符串的最后一个字符

时间:2017-06-01 08:46:23

标签: sql-server tsql

我有一个SQL表,其中HTML存储在一个字段中。需要替换此HTML的一部分。值的一个例子可能是:

<!DOCTYPE html
...... //more html
<!-- MAIN CONTENT -->
<table>
    <tr>
        <td ...... />

现在,使用此查询:

SELECT [Id_Of_Content], 
PATINDEX('<!DOCTYPE%%<!-- MAIN CONTENT -->%<td%>', [Content]) AS StartIndex,
PATINDEX('%<!-- MAIN CONTENT -->%<td%>', [Content]) AS EndIndex
FROM MyTable

我得到了这个结果:

ContentId | StartIndex | EndIndex
1           1            5825
2           1            5819

现在,起始索引是正确的,因为<!DOCTYPE元素始终位于我的HTML顶部。但是结束索引并不是我想要的结果:它始终是搜索到的字符串的第一个字符的索引,在本例中是<。我需要><td%>字符的索引。我怎么能得到这个?

1 个答案:

答案 0 :(得分:0)

首先找到'主要内容'开始的位置。 然后找到'TD'开始的位置。 然后找到'&gt;'的位置启动。

-2代表'&lt;'在'! - 主要内容'和'TD'中计算两次。

此代码适用于您的示例,但如果您有多个TD标记,则可能与您的预期不同(它将使用第一个)。

declare @content varchar(max) = '<!DOCTYPE html
...... //more html
<!-- MAIN CONTENT -->
<table>
    <tr>
        <td ...... />'

Select EndInSub+TDStartInSub+MainContentStart-2 EndIndex
from(
    select Patindex('%>',[TDSub]) [EndInSub],*
    from( 
        Select SUBSTRING([MainContentSub],[TDStartInSub], [Total Length]) [TDSub],*
        from (
            select PATINDEX('%<td%>',[MainContentSub])[TDStartInSub],*
            from (
                select substring(@content,[MainContentStart],[Total Length]) [MainContentSub],*
                from(
                    select PATINDEX('%<!-- MAIN CONTENT -->%<td%>',@content) [MainContentStart], len(@content) [Total Length]) A)B)C)D)E