php: yerine çift

3 Cevap php

benim CMS RTF verilerini yazmak için nicEdit kullanın. Sorun böyle dizeleri oluşturur:

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

Bu bir haber sitesi için olduğundan, ben çok bu gibi olmak için son html tercih:

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

bu yüzden benim geçerli çözüm şudur:

  1. i dize başlangıç ​​/ sonunda <br /> için $ verileri Döşeme gerekir
  2. 2 <br/> ya da daha fazla olan tüm dizeleri yerini </p><p> (tek <br /> izin verilir).
  3. Son olarak, sonunda <p> başlangıcında ve </p> ekleyin

şimdiye kadar sadece 1. ve 3. adımları var. Birisi bana adım 2 ile bir el verebilir?

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;
}

teşekkürler!

ps: bu özel durumları önlemek için daha iyi olurdu. örneğin: "hello<br /><br /><br /><br /><br />too much space," -, bu 5 breaklines da dönüştürülmesi gereken tek bir "{[(1)"}]

final solution (kemp özel teşekkür!)

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;
}

3 Cevap

Bu iki <br> s farklı çizgiler (yani aralarında bir satır ya da herhangi bir boşluk yoktur) üzerinde bile çalışır:

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

Bu yaklaşım sorununuzu çözecektir:

  1. <br> veya <br /> üzerine dize bölmek: dizeleri bir dizi alırsınız.
  2. Yeni bir dize oluşturun <p>.
  3. Sonuna kadar başından 1 dizi üzerinde döngü ve boş olmayan bir girişi (kırmak) kadar, boş olan tüm girdileri kaldırın.
  4. 3 ile aynı, fakat dizi başlangıcına sonundan.
  5. Loop on the array of 1, have an integer value A (default 0), which states that there is a single or double break.
    1. Dizge boşsa, A değeri ve continue döngü artırır.
    2. If the string is not empty:
      1. A değeri altında 1 ya da ise, bir <br> append.
      2. A değeri 2 veya üzerinde ise, bir </p><p> append.
    3. (Boş değil) geçerli giriş içerik ekleyin.
    4. A değerini 0 olarak ayarlayın.
  6. Append </p>

Farklı bir yaklaşım: Düzenli ifadeler kullanarak

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

Maç olacak 2 veya daha fazla <br>. (Bunun nasıl php.net on preg_split bakın.)

Şimdi, adım 2 ve 3 aynı yaklaşım: dizisinde döngü kere, iki kere yukarı başlayan (0 .. uzunluk) gelen ve bir kez ucundan aşağı (length-1. .0). Giriş boşsa, diziden çıkarın. Giriş boş değilse, döngü çıkın.

Bunu yapmak için:

$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>';

Ben tamamen senaryo anlayış değilim sürece bu adım # 2 için çalışması gerektiğini düşünüyorum:

$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 );