2012-06-03 37 views
9

Tôi cần trợ giúp viết hàm regex chuyển đổi chuỗi HTML thành tên thẻ XML hợp lệ. Ví dụ: Phải mất một chuỗi và thực hiện như sau:Regex - Chuyển đổi HTML thành thẻ XML hợp lệ

  • Nếu một bảng chữ cái hoặc dấu gạch dưới xảy ra trong chuỗi, nó giữ nó
  • Nếu bất kỳ ký tự khác xảy ra, nó loại bỏ khỏi chuỗi đầu ra.
  • Nếu bất kỳ ký tự nào khác xảy ra giữa các từ hoặc chữ cái, nó được thay thế bằng dấu gạch dưới.
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 

Về cơ bản các chức năng regex nên chuyển đổi chuỗi HTML để một thẻ XML hợp lệ.

+3

Câu hỏi của bạn nói: "Tôi muốn viết", nhưng nó đọc như một danh sách yêu cầu và chờ đợi một người nào đó để thả các mã regex kỳ diệu mong muốn. Không rõ ràng những gì bạn xem xét thẻ XML anyway, ví dụ đầu ra không chứa. – mario

+0

@JackManey: Hiện có hơn 4000 phiếu bầu ...? Sheesh. – mpen

+1

Điều gì sẽ xảy ra nếu tình huống chỉ xuất hiện một lần trong một mặt trăng màu xanh và nó chỉ là thêm một '' bản vá lỗi nhanh chóng và bẩn'' vào mã thử nghiệm của bạn trong một vòng xoáy! VÀ SỬ DỤNG REGEX INSTEAD DOM ... – Cylian

Trả lời

5

Một chút regex và một chút chức năng tiêu chuẩn:

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

Hãy thử điều này

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

Giải thích

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

nên có thể sử dụng:

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

Vì vậy, có lookarounds để xem nếu có một nhân vật alpha trước và một fter và thay thế bất kỳ non-alpha/non-underscore nào giữa nó.

1

Tôi tin rằng những điều sau đây sẽ hiệu quả.

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

Phần đầu tiên của regex [^A-Za-z_]+ khớp với một hoặc nhiều ký tự không phải là chữ cái hoặc dấu gạch dưới. Phần cuối của regex là như nhau, ngoại trừ nó là tùy chọn. Đó là để cho phép phần giữa, (.*)? cũng là tùy chọn, để bắt bất kỳ ký tự nào (kể cả chữ cái và dấu gạch dưới) giữa hai ký tự bị liệt vào danh sách đen.

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