2010-06-02 43 views
8

tôi sử dụng nicEdit để ghi dữ liệu RTF trong CMS của tôi. Vấn đề là nó tạo ra chuỗi như thế này:php: thay thế đôi <br /> bằng</p><p>

hello first line<br><br />this is a second line<br />this is a 3rd line 

vì đây là một trang web tin tức, tôi rất thích html thức là như thế này:

<p>hello first line</p><p>this is a second line<br />this is a 3rd line</p> 

vì vậy giải pháp hiện tại của tôi là thế này:

  1. tôi cần phải cắt dữ liệu $ cho <br /> lúc bắt đầu/kết thúc của chuỗi
  2. thay thế tất cả các chuỗi có 2 <br/> trở lên với </p><p> (một đơn <br /> được cho phép).
  3. cuối cùng, thêm <p> lúc bắt đầu và </p> vào cuối

tôi chỉ có bước 1 và 3 cho đến nay. ai đó có thể cho tôi một bàn tay với bước 2?

function replace_br($data) { 
# step 1 
$data = trim($data,'<p>'); 
$data = trim($data,'</p>'); 
$data = trim($data,'<br />'); 
# step 2 ??? 
// preg_replace() ? 
# step 3 
$data = '<p>'.$data.'</p>'; 
return $data; 
} 

cảm ơn!

ps: sẽ tốt hơn nếu bạn tránh các tình huống cụ thể. Ví dụ: "hello<br /><br /><br /><br /><br />too much space" - những 5 breaklines cũng nên được chuyển đổi sang chỉ là một "</p><p>"

giải pháp cuối cùng

function sanitize_content($data) { 
    $data = strip_tags($data,'<p>,<br>,<img>,<a>,<strong>,<u>,<em>,<blockquote>,<ol>,<ul>,<li>,<span>'); 
    $data = trim($data,'<p>'); 
    $data = trim($data,'</p>'); 
    $data = trim($data,'<br />'); 
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#','</p><p>',$data); 
    $data = '<p>'.$data.'</p>'; 
    return $data; 
} 

Trả lời

13

này sẽ làm việc ngay cả khi hai <br> s là trên các dòng khác nhau (nghĩa là có một dòng mới hoặc khoảng trống giữa chúng):

function replace_br($data) { 
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data); 
    return "<p>$data</p>"; 
} 
+0

bạn là người đàn ông! hehe, preg_replace là cách hiệu quả nhất để làm điều này. cảm ơn! tôi phải học regexp tốt hơn hehe. – andufo

+0

Điều gì về '
'? – Gumbo

+0


cũng đang được xử lý khi áp dụng "?" trong regexp – andufo

2

Cách tiếp cận này sẽ giải quyết vấn đề của bạn:

(đặc biệt nhờ kemp!)
  1. Tách chuỗi trên <br> hoặc <br />: bạn sẽ nhận được một chuỗi các chuỗi.
  2. Tạo chuỗi mới <p>.
  3. Vòng lặp trên mảng 1, từ đầu đến cuối và xóa tất cả các mục trống, cho đến khi mục nhập không trống (ngắt).
  4. Giống như 3, nhưng từ đầu đến cuối mảng.
  5. Vòng lặp trên mảng 1, có giá trị số nguyên A (mặc định 0), cho biết có một ngắt đơn hoặc kép.
    1. Nếu chuỗi rỗng, hãy tăng giá trị của A và tiếp tục vòng lặp.
    2. Nếu chuỗi không rỗng:
      1. Nếu giá trị của A là 1 hoặc thấp hơn, thêm một <br>.
      2. Nếu giá trị của A từ 2 trở lên, hãy thêm </p><p>.
    3. Nối nội dung của mục nhập hiện tại (không rỗng).
    4. Đặt giá trị của A thành 0.
  6. Nối </p>

Một cách tiếp cận khác nhau: sử dụng Regular Expressions

(<br ?/?>){2,} 

sẽ phù hợp với 2 hoặc nhiều <br>. (Xem php.net on preg_split về cách thực hiện điều này.)

Bây giờ, cách tiếp cận tương tự ở bước 2 và 3: lặp lại mảng hai lần, một lần từ đầu (0..length) và một lần từ cuối xuống (chiều dài -1,,0). Nếu mục nhập trống, hãy xóa nó khỏi mảng. Nếu mục nhập không trống, hãy thoát khỏi vòng lặp.

Để làm điều này:

$array = preg_split('/(<br ?/?>\s*){2,}/i', $string); 

foreach($i = 0; $i < count($array); $i++) { 
    if($value == "") { 
     unset($array[$i]); 
    }else{ 
     break; 
    } 
} 

foreach($i = count($array) - 1; $i >= 0; $i--) { 
    if($value == "") { 
     unset($array[$i]); 
    }else{ 
     break; 
    } 
} 

$newString = '<p>' . implode($array, '</p><p>') . '</p>'; 
+0

thực sự nó sẽ còn tốt hơn nếu thứ ere là một cách để tìm một chuỗi với 2 hoặc nhiều hơn
- im suy nghĩ về preg_replace nhưng vẫn không có ý tưởng về cách tiếp tục. – andufo

+0

Cách tiếp cận đầu tiên cũng xử lý chúng. Cách tiếp cận thứ hai dễ thực hiện hơn, nhưng câu hỏi đặt ra là liệu bạn có muốn sử dụng RegEx trên HTML hay không (một số người không thích cách tiếp cận đó). – Pindatjuh

+0

cảm ơn cho các mô hình, nhưng tôi nghĩ rằng một cái gì đó là sai. im sử dụng: $ data = preg_replace ('(
) {2,}', 'aaa', $ dữ liệu); và nó trả về null. tại sao? (im sử dụng "aaa" để làm cho nó dễ thấy hơn khi được áp dụng) – andufo

0

Tôi nghĩ rằng điều này sẽ làm việc cho bướC# 2 trừ khi tôi không hiểu kịch bản của bạn hoàn toàn:

$string = str_replace('<br><br>', '</p><p>', $string); 
$string = str_replace('<br /><br />', '</p><p>', $string); 
$string = str_replace('<br><br />', '</p><p>', $string); 
$string = str_replace('<br /><br>', '</p><p>', $string); 
+0

cảm ơn ý tưởng, nhưng nó là cơ bản. tôi cần một cách tiếp cận nâng cao hơn. kiểm tra các giải pháp cuối cùng trên đầu trang. – andufo

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