2017-06-01 129 views
0

我有一個存儲在字段中的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

您不能,您需要搜索該字符串後面的任何內容並使用該索引。這裏的問題是,你使用的工具並不是真的意味着要做這樣的事情。使用SQL不容易這樣做的原因是因爲SQL是錯誤的工具。你應該用適當的編程語言來處理這種類型的處理,這些語言具有更好的工具,比如完全支持正則表達式。 –

+0

感謝您的反饋。這是一次性的腳本,所以想到在C#中寫一些東西來做到這一點並沒有發生在我身上。我會嘗試尋找我想要的角色之後的起始索引。 – ohyeah

回答

0

首先找到'主要內容'開始的位置。 然後找到'TD'開始的位置。 然後找到'>'開始的位置。

-2代表'! - 主要內容'和'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 
相關問題