2016-04-09 6 views
0

Ich habe eine Reihe von Zeichenfolgen, die ich in "Satz Case" konvertieren muss, aber was es komplizierter macht, ist, dass die Zeichenfolge HTML-Anker-Tags haben könnte.Wenden Sie Sentence Case auf Zeichenfolge, die HTML enthalten könnte

Man könnte html wie folgt enthalten:

<a href="/foo">foo</a> is a word. this is another word, and <a href="/bar">bar</a> is another. 

Und ich möchte Satz Fall mit Ausgang anzuwenden, wie folgt:

<a href="/foo">Foo</a> is a word. This is another word, and <a href="/bar">bar</a> is another. 

Ich kann jede Lösung verwenden, die js oder vbscript nutzt.

+0

Und was hast du probiert? Poste diesen Code auf deine Frage. – Andy

+0

Nun, ich bin mir nicht sicher, wie ich das Problem angehen soll, also brauche ich Hilfe bei der Logik. Ich werde es mit Regex versuchen, aber ich bin mir nicht sicher, wie ich es angehen soll. – GWR

+0

Warum die Stimme runter? Ich wollte zu Recht mit der Logik für diese Hilfe. Helfen Sie mir zu verstehen, was ist mit der Frage nicht angemessen und das garantiert eine Down-Abstimmung. – GWR

Antwort

1

falls jemand. schaut, hier ist ein Hafen von Rion Williams l ogic zu einer vbScript Funktion. Ich benutzte ein paar Funktionen aus meiner eigenen Klassenbibliothek, also nur die benötigten Teile davon als Referenz.

Wie Rion gesagt hat, ist es nur ein Anfang und wird viel Feinabstimmung brauchen.

Function toSentenceCase(byVal x) 
    Dim i, r, s, bCapitalize, bInHtml 

    bCapitalize = True 
    bInHtml = False 

    Set r = New regularExpression 
    Set s = New adoStream 

    For i = 1 To Len(x) 
     sChar = Mid(x, i, 1) 
     Do 
      'If this is any non tag, punctuation or letter or we are in HTML and haven't encountered a closing tag 
      If r.test("[^a-zA-Z\?\.\>\\<\!]", sChar) Or (bInHtml And sChar <> ">") Then 
       s sChar 
       Exit Do 
      End If 

      'if we should capitalize, check if we can, and if yes, then capitalize 
      If bCapitalize And r.test("[a-zA-Z]", sChar) Then 
       s uCase(sChar) 
       bCapitalize = False 
       Exit Do 
      Else 
       s sChar 

       'if this character is '<', then we are in HTML, so ignore these 
       If sChar = "<" Then 
        bInHtml = True 
        Exit Do 
       End If 

       'if the character is a closing tag '>', then start paying attention again 
       If sChar = ">" Then 
        bInHtml = False 
        Exit Do 
       End If 

       'determine if we hit punctuation to start a new sentence 
       If r.test("[\?\!\.]", sChar) Then 
        bCapitalize = True 
        Exit Do 
       End If 

      End If 

     Loop While False 
    Next 

    toSentenceCase = s.Value 
End Function 

Class adoStream 
    'string builder class. adodb streams are way faster than appending to/editing content of string variables 
    Private stream 

    Private Sub Class_Initialize()     
     Set stream = CreateObject("ADODB.Stream") 
     stream.Type = 2 '2 = text stream 
     stream.Open 
    End Sub 

    Private Sub Class_Terminate() 
     stream.Close 
     Set stream = Nothing 
    End Sub 

    Public Default Sub Add(byVal addString) 'add string to existing stream 
     stream.WriteText addString 
    End Sub 

    Public Sub Update(byVal addString) 'update existing stream and set it to a new value. clear existing stream and set it = new value 
     Clear 
     stream.WriteText addString 
    End Sub 

    Public Property Get Value 'returns full stream 
     stream.Position = 0 
     Value = stream.ReadText() 
    End Property 

    Public Function Clear() 'resets stream 
     stream.Position = 0 
     Call stream.SetEOS() 
    End Function   
End Class 


Class regularExpression 
    'class containing a set of vbscript regex routines 
    Private oRegex 
    Private Sub Class_Initialize()     
     Set oRegex = New RegExp 
     oRegex.Global = True 'e.g. findall 
     oRegex.IgnoreCase = True 
    End Sub 

    Private Sub Class_Terminate() 
     Set oRegex = Nothing 
    End Sub 

    'test 
    Public Function test(byVal sPattern, byVal sTestString) 'return t/f 
     If isNull(sTestString) Then 
      test = False 
      Exit Function 
     End If 
     oRegex.Pattern = sPattern 
     test = oRegex.test(sTestString) 
    End Function 
End Class 
2

Ich nehme an, dass Sie einen eher naiven Ansatz erstellen könnten, der einfach durch die Zeichenfolge iteriert und Bedingungen basierend auf dem kennzeichnet (dh es setzt ein inHtml Flag, um anzuzeigen, dass es in einem HTML-Tag ist und setzt ein anderes shouldCapitalize Flag festzustellen, ob es zu Beginn eines Satzes:

function titleCaseHtmlSentence(s){ 
    // A temporary string to hold your results 
    var result = ''; 
    // Iterate through the sentence and check each character to determine if 
    // it is the start of a sentence, ignore this 
    var shouldCapitalize = true; 
    var inHtml = false; 
    for(var i = 0; i < s.length; i++){ 
     // If this is any non tag, punctuation or letter or we are in HTML 
     // and haven't encountered a closing tag 
     if(/[^a-zA-Z\?\.\>\\<\!]/.test(s[i]) || (inHtml && s[i] != '>')){ 
      result += s[i]; 
      continue; 
     } 
     // If we should capitalize, check if we can 
     if(shouldCapitalize && /[a-zA-Z]/.test(s[i])){ 
      // Capitalize this character 
      result += s[i].toUpperCase(); 
      shouldCapitalize = false; 
      continue; 
     } 
     else{ 
      result += s[i]; 
      // If this character is '<', then we are in HTML, so ignore these 
      if(s[i] == '<'){ 
       inHtml = true; 
       continue; 
      } 
      // If the character is a closing tag '>', then start paying attention again 
      if(s[i] == '>'){ 
       inHtml = false; 
       continue; 
      } 

      // Determine if we hit punctuation to start a new sentence 
      if(/[\?\!\.]/.test(s[i])){ 
       shouldCapitalize = true; 
       continue; 
      } 
     } 
    } 
    return result; 
} 

ich es warf zusammen ziemlich schnell, so dass ich bin sicher, dass in irgendeiner Weise bei weitem nicht optimal ist, aber es sollte als seen in this example arbeiten