2013-04-25 50 views
5

Chúng tôi có hệ thống cms viết khối nội dung html vào cơ sở dữ liệu máy chủ sql. Tôi biết tên bảng và tên trường nơi các khối nội dung html này cư trú. Một số html chứa liên kết() đến tệp pdf. Đây là một đoạn:Cách trích xuất tên tệp từ một trường có chứa nội dung html trong máy chủ sql?

<p>A deferred tuition payment plan, 
or view the <a href="/uploadedFiles/Tuition-Reimbursement-Deferred.pdf" 
target="_blank">list</a>.</p> 

Tôi cần trích xuất tên tệp pdf từ tất cả các khối nội dung html như vậy. Cuối cùng, tôi cần có danh sách:

Tuition-Reimbursement-Deferred.pdf 
Some-other-file.pdf 

của tất cả tên tệp pdf từ trường đó.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn.

CẬP NHẬT

Tôi đã nhận được nhiều phản hồi, cảm ơn bạn rất nhiều, nhưng tôi quên đề cập đến mà chúng ta vẫn đang sử dụng SQL Server 2000 ở đây. Vì vậy, điều này đã được thực hiện bằng cách sử dụng SQL 2000 SQL.

+2

tất cả họ đều sẽ có một thư mục mà trước tên tập tin? –

+0

Bạn có phải làm điều này trong TSQL không? Đó là một ngôn ngữ rất nghèo để phân tích văn bản, và nó sẽ dễ dàng hơn nhiều trong một ngôn ngữ khác có thư viện phân tích cú pháp HTML. – Pondlife

+0

Đồng ý, đó chỉ là một lựa chọn nhanh. Nếu cần, tôi sẽ sử dụng HTMLAgilityPack trong mã C# để phân tích cú pháp nội dung. – monstro

Trả lời

1

Vâng nó không đẹp nhưng công trình này sử dụng tiêu chuẩn Transact-SQL:

SELECT CASE WHEN CHARINDEX('.pdf', html) > 0 
      THEN SUBSTRING(
        html, 
        CHARINDEX('.pdf', html) - 
        PATINDEX(
         '%["/]%', 
         REVERSE(SUBSTRING(html, 0, CHARINDEX('.pdf', html)))) + 1, 
        PATINDEX(
         '%["/]%', 
         REVERSE(SUBSTRING(html, 0, CHARINDEX('.pdf', html)))) + 3) 
      ELSE NULL 
     END AS filename 
FROM mytable 

thể mở rộng danh sách các ký tự phân chia ranh giới trước tên tập tin từ ["/] (mà phù hợp hoặc một dấu ngoặc kép hoặc dấu gạch chéo) nếu bạn thích.

Xem SQL Fiddle demo

+0

Tuyệt vời, tôi quên đề cập đến chúng tôi có SQL 2000 ở đây, vì vậy cách tiếp cận này công trinh !! Cảm ơn rất nhiều. – monstro

3

Tạo chức năng này:

create function dbo.extract_filenames_from_a_tags (@s nvarchar(max)) 
returns @res table (pdf nvarchar(max)) as 
begin 
-- assumes there are no single quotes or double quotes in the PDF filename 
declare @i int, @j int, @k int, @tmp nvarchar(max); 
set @i = charindex(N'.pdf', @s); 
while @i > 0 
begin 
    select @tmp = left(@s, @i+3); 
    select @j = charindex('/', reverse(@tmp)); -- directory delimiter 
    select @k = charindex('"', reverse(@tmp)); -- start of href 
    if @j = 0 or (@k > 0 and @k < @j) set @j = @k; 
    select @k = charindex('''', reverse(@tmp)); -- start of href (single-quote*) 
    if @j = 0 or (@k > 0 and @k < @j) set @j = @k; 
    insert @res values (substring(@tmp, len(@tmp)[email protected]+2, len(@tmp))); 
    select @s = stuff(@s, 1, @i+4, ''); -- remove up to ".pdf" 
    set @i = charindex(N'.pdf', @s); 
end 
return 
end 
GO 

Một bản demo về việc sử dụng mà chức năng:

declare @t table (html varchar(max)); 
insert @t values 
    (' 
<p>A deferred tuition payment plan, 
or view the <a href="/uploadedFiles/Tuition-Reimbursement-Deferred.pdf" 
target="_blank">list</a>.</p>'), 
    (' 
<p>A deferred tuition payment plan, 
or view the <a href="Two files here-Reimbursement-Deferred.pdf" 
target="_blank">list</a>.</p>And I use single quotes 
    <a href=''/look/path/The second file.pdf'' 
target="_blank">list</a>'); 

select t.*, p.pdf 
from @t t 
cross apply dbo.extract_filenames_from_a_tags(html) p; 

Kết quả:

|HTML     |          PDF | 
-------------------------------------------------------------------- 
|<p>A deferred tui.... |  Tuition-Reimbursement-Deferred.pdf | 
|<p>A deferred tui.... | Two files here-Reimbursement-Deferred.pdf | 
|<p>A deferred tui.... |      The second file.pdf | 

SQL Fiddle Demo

+1

Đó là một chức năng tuyệt vời. –

+0

Cảm ơn rất nhiều, nó hoạt động hoàn hảo, nhưng tôi quên đề cập rằng chúng tôi vẫn đang sử dụng SQL Server 2000 ở đây và mã này sẽ không hoạt động trên SQL 2000. – monstro

1

Làm thế nào để xử lý HTML đó dưới dạng XML?

declare @t table (html varchar(max)); 
insert @t 
    select ' 
    <p>A deferred tuition payment plan, 
    or view the <a href="/uploadedFiles/Tuition-Reimbursement-Deferred.pdf" 
    target="_blank">list</a>.</p>' 
    union all 
    select ' 
    <p>A deferred tuition payment plan, 
    or view the <a href="Two files here-Reimbursement-Deferred.pdf" 
    target="_blank">list</a>.</p>And I use single quotes 
     <a href=''/look/path/The second file.pdf'' 
    target="_blank">list</a>' 

select [filename] = reverse(left(reverse('/'+p.n.value('@href', 'varchar(100)')), charindex('/',reverse('/'+p.n.value('@href', 'varchar(100)')), 1) - 1)) 
from ( select cast(html as xml) 
      from @t 
     ) x(doc) 
cross 
apply doc.nodes('//a') p(n); 

Kết quả:

filename 
--------------------------------------------------------------- 
Tuition-Reimbursement-Deferred.pdf 
Two files here-Reimbursement-Deferred.pdf 
The second file.pdf 
1

Hãy thử điều này một -

DECLARE @XML XML = 
'<p>A deferred tuition payment plan, 
or view the <a href="/uploadedFiles/Tuition-Reimbursement-Deferred.pdf" 
target="_blank">list</a>.</p>' 

SELECT 
     ref_text = t.p.value('./a[1]', 'NVARCHAR(50)') 
    , ref_filename = REVERSE(
         LEFT(REVERSE(t.p.value('./a[1]/@href', 'NVARCHAR(50)')), 
         CHARINDEX('/',REVERSE(t.p.value('./a[1]/@href', 'NVARCHAR(50)')), 1) - 1)) 
FROM @XML.nodes('/p') t(p) 
+0

Cảm ơn rất nhiều, nhưng tôi quên đề cập đến rằng chúng tôi vẫn đang sử dụng SQL Server 2000 ở đây, và nó không có kiểu dữ liệu XML: ( – monstro

Các vấn đề liên quan