我有一个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%>
字符的索引。我怎么能得到这个?
答案 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