2012-06-03 4 views
9

Ich brauche Hilfe beim Schreiben einer Regex-Funktion, die HTML-Zeichenfolge in einen gültigen XML-Tag-Namen konvertiert. Ex: Es nimmt einen String und führt Folgendes aus:Regex - Konvertieren von HTML in gültige XML-Tag

  • Wenn ein Alphabet oder Unterstrich in der Zeichenfolge auftritt, hält
  • Wenn ein anderes Zeichen auftritt, ist es aus dem Ausgabe-String entfernt.
  • Wenn ein anderes Zeichen zwischen Wörtern oder Buchstaben auftritt, wird es durch einen Underscore ersetzt.
Ex: 
Input: Date Created 
Ouput: Date_Created 

Input: Date<br/>Created 
Output: Date_Created 

Input: Date\nCreated 
Output: Date_Created 

Input: Date 1 2 3 Created 
Output: Date_Created 

Grundsätzlich ist die regex Funktion des HTML-String in einen gültigen XML-Tag umwandeln sollte.

+3

Ihre Frage sagt: „Ich will schreiben“, aber es liest sich wie eine Anforderungsliste und warten, dass jemand die gewünschten Magie regex Codes fallen zu lassen. Nicht klar, was Sie als XML-Tags überhaupt betrachten, die Ausgabe-Beispiele enthalten keine. – mario

+0

@JackManey: Das hat über 4000 upvotes jetzt ..? Meine Güte. – mpen

+1

Was ist los, wenn die Situation nur einmal bei einem blauen Mond kommt und es ist nur ein "schnell und schmutzig Patch-up" zu Ihrem Test-Code in einem Wirbel hinzufügen! UND NUTZEN REGEX STATT DOM ... – Cylian

Antwort

5

Ein bisschen regex und ein bisschen von Standardfunktionen:

function mystrip($s) 
{ 
     // add spaces around angle brackets to separate tag-like parts 
     // e.g. "<br />" becomes " <br /> " 
     // then let strip_tags take care of removing html tags 
     $s = strip_tags(str_replace(array('<', '>'), array(' <', '> '), $s)); 

     // any sequence of characters that are not alphabet or underscore 
     // gets replaced by a single underscore 
     return preg_replace('/[^a-z_]+/i', '_', $s); 
} 
2

Versuchen Sie, diese

$result = preg_replace('/([\d\s]|<[^<>]+>)/', '_', $subject); 

Erklärung

" 
(    # Match the regular expression below and capture its match into backreference number 1 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     [\d\s]   # Match a single character present in the list below 
         # A single digit 0..9 
         # A whitespace character (spaces, tabs, and line breaks) 
    |    # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     <    # Match the character “<” literally 
     [^<>]   # Match a single character NOT present in the list “<>” 
     +    # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
     >    # Match the character “>” literally 
) 
" 
2

zu verwenden, sollten in der Lage:

$text = preg_replace('/(?<=[a-zA-Z])[^a-zA-Z_]+(?=[a-zA-Z])/', '_', $text); 

So lookarounds gibt es zu sehen, ob es ein Alpha-Zeichen vor und ein fter und ersetzt alle Nicht-Alpha/Nicht-Unterstriche zwischen diesen.

1

Ich glaube, das folgende sollte funktionieren.

preg_replace('/[^A-Za-z_]+(.*)?([^A-Za-z_]+)?/', '_', $string); 

Der erste Teil der Regex [^A-Za-z_]+ ein oder mehr Zeichen übereinstimmt, die nicht alphabetisch oder ein Unterstrich ist. Der Endteil der Regex ist derselbe, außer es ist optional. Das erlaubt dem mittleren Teil (.*)?, der auch optional ist, alle Zeichen (sogar alphabetische und Unterstriche) zwischen zwei schwarzen Listen zu fangen.