2010-06-02 23 views
8

uso nicEdit para escribir datos RTF en mi CMS. El problema es que genera cadenas como esta:php: reemplazar el doble <br /> con</p><p>

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

ya que este es un sitio de noticias, Prefiero el final de HTML que ser así:

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

así que mi solución actual es la siguiente:

  1. i necesidad de recortar los datos de $ <br /> en el inicio/final de la cadena
  2. reemplazar todas las cadenas que tienen 2 <br/> o más con </p><p> (se permite una sola <br />).
  3. por último, añadir <p> al principio y al final </p>

sólo tengo los pasos 1 y 3 hasta el momento. ¿alguien puede ayudarme con el paso 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; 
} 

gracias!

pd: sería incluso mejor evitar situaciones específicas. ejemplo: "hello<br /><br /><br /><br /><br />too much space" - esas 5 líneas de rotura también deben ser convertidos a un solo "</p><p>"

solución final

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

Respuesta

13

Esto funcionará incluso si los dos <br> s son en diferentes líneas (es decir, hay una nueva línea o cualquier espacio en blanco entre ellos):

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

eres el hombre! jeje, preg_replace es la forma más eficiente de hacer esto. ¡Gracias! Tengo que aprender regexp mejor jeje. – andufo

+0

¿Qué pasa con '
'? – Gumbo

+0


también se está cuidando al aplicar el "?" en la expresión regular – andufo

2

Este enfoque va a resolver su problema:

(gracias especiales a Kemp!)
  1. Divida la cadena en <br> o <br />: obtendrá una serie de cadenas.
  2. Crea una nueva cadena <p>.
  3. Haga un ciclo en la matriz de 1, desde el principio hasta el final y elimine todas las entradas que estén vacías, hasta que una entrada no esté vacía (corte).
  4. Igual que 3, pero desde el final hasta el comienzo de la matriz.
  5. Loop en la matriz de 1, tiene un valor entero A (predeterminado 0), que indica que hay una interrupción simple o doble.
    1. Si la cadena está vacía, aumente el valor de A y continue el ciclo.
    2. Si la cadena no está vacía:
      1. Si el valor de A es 1 o inferior, añadir una <br>.
      2. Si el valor de A es 2 o superior, añada un </p><p>.
    3. Agregue el contenido de la entrada actual (que no está vacía).
    4. Establezca el valor de A en 0.
  6. Anexar </p>

Un enfoque diferente: el uso de expresiones regulares

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

coincidirá con 2 o más <br>. (Consulte php.net on preg_split sobre cómo hacer esto.)

Ahora, el mismo enfoque en los pasos 2 y 3: repita el ciclo dos veces, una vez desde el inicio (0..length) y una vez desde el final hacia abajo (length -1..0). Si la entrada está vacía, quítela del conjunto. Si la entrada no está vacía, salga del ciclo.

Para ello:

$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

En realidad, sería aún mejor si th Había una manera de encontrar una cadena con 2 o más
- estoy pensando en preg_replace pero todavía no tengo una idea de cómo continuar. – andufo

+0

El primer enfoque también maneja esos. El segundo enfoque es más fácil de implementar, pero la pregunta es si te gusta usar RegEx en HTML (a algunas personas no les gusta ese enfoque). – Pindatjuh

+0

gracias por el patrón, pero creo que algo está mal. estoy usando: $ data = preg_replace ('(
) {2,}', 'aaa', $ data); y devuelve nulo. ¿por qué? (estoy usando "aaa" para hacerlo más visible una vez aplicado) – andufo

0

creo que esto debería funcionar para el paso # 2, a menos que no soy la comprensión de su situación por completo:

$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

gracias por la idea, pero es básico. Necesito un enfoque más avanzado. mira la solución final en la parte superior. – andufo

Cuestiones relacionadas