2012-06-03 19 views
9

HTML dizesini geçerli bir XML etiket adına dönüştüren bir normal ifade işlevi yazarken yardıma ihtiyacım var. Ör: Bu bir dize alır ve şunları yapar: Bir alfabe veya alt çizgi dizede oluşursa başka bir karakter oluşursa Regex - HTML'yi geçerli XML etiketine dönüştürme

  • , onu
  • tutar

    , bu çıkış dizesi kaldırılır.
  • Sözcük veya harf arasında başka bir karakter oluşuyorsa, bunun yerine bir Altçizgi konulur.
    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 
    

Temelde regex işlevi geçerli bir XML etiketi HTML dize dönüştürmek gerekir.

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

Yani, bir alfa karakter önce olup olmadığını görmek için lookarounds var:

+3

Sorunuz "Ben yazmak istiyorum", ama bir gereklilik listesi gibi okur ve birini bekliyor istenen sihirli regex kodları düşmesi söylüyor. XML etiketlerini neleri göz önünde bulundurduğunuz net değil, çıktı örnekleri hiçbiri içermiyor. – mario

+0

@JackManey: Şimdi 4000'den fazla upvotes var ..? Sheesh. – mpen

+1

Durum mavi bir ayda yalnızca bir kez geliyorsa ve test kodunuzda bir '' hızlı ve kirli yama-up '' eklemeniz yanlış olur! VE DOM REGEX KULLANIMI ... – Cylian

cevap

5

regex Biraz ve standart fonksiyonlar biraz:

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

kullanabilmek için olmalı bu

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

Açıklama

" 
(    # 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

deneyin ve bir Fter ve alfa olmayan/olmayan alt çizgi arasında yerini alır.

1

Aşağıdakilerin çalışması gerektiğine inanıyorum.

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

değil alfabetik veya alt çizgi, bir veya daha fazla karakter eşleşir [^A-Za-z_]+ regex ilk bölümü. İsteğe bağlı olması dışında normal ifadenin bitiş kısmı aynıdır. Bu, kara listeye alınmış iki karakter arasındaki herhangi bir karakteri (alfabetik ve alt çizgi bile olsa) yakalamak için isteğe bağlı olan orta bölüm (.*)?'a izin vermek içindir.