2011-11-18 14 views
7

Estoy tratando de dividir cadenas a la mitad, y no debe dividirse en el medio de una palabra.Separar cadenas por la mitad (Word-Aware) con PHP

Hasta el momento se me ocurrió lo siguiente, que es el 99% de trabajo:

$text = "The Quick : Brown Fox Jumped Over The Lazy/Dog"; 
$half = (int)ceil(count($words = str_word_count($text, 1))/2); 
$string1 = implode(' ', array_slice($words, 0, $half)); 
$string2 = implode(' ', array_slice($words, $half)); 

Esto funciona, dividiendo correctamente cualquier cadena en medio de acuerdo con el número de palabras en la cadena. Sin embargo, es la eliminación de todos los símbolos en la cadena, por ejemplo, para el ejemplo anterior seria:

The Quick Brown Fox Jumped 
Over The Lazy Dog 

necesito mantener todos los símbolos como: y/en la cadena después de ser dividida. No entiendo por qué el código actual es la eliminación de los símbolos ... Si usted puede proporcionar un método alternativo o fijar este método para no quitar los símbolos, que sería muy apreciada :)

Respuesta

17

Al ver su salida de ejemplo, noté que todos nuestros ejemplos están apagados, le estamos dando menos a la cadena1 si la mitad de la cadena está dentro de una palabra en lugar de dar más.

Por ejemplo, el medio de The Quick : Brown Fox Jumped Over The Lazy/Dog es The Quick : Brown Fox Ju que está en medio de una palabra, este primer ejemplo da a string2 la palabra dividida; el ejemplo inferior le da a string1 la palabra dividida.

dar menos a la secuencia 1 en la palabra dividida

$text = "The Quick : Brown Fox Jumped Over The Lazy/Dog"; 

$middle = strrpos(substr($text, 0, floor(strlen($text)/2)), ' ') + 1; 

$string1 = substr($text, 0, $middle); // "The Quick : Brown Fox " 
$string2 = substr($text, $middle); // "Jumped Over The Lazy/Dog" 

dar más a la secuencia 1 en la palabra dividida

$text = "The Quick : Brown Fox Jumped Over The Lazy/Dog"; 

$splitstring1 = substr($text, 0, floor(strlen($text)/2)); 
$splitstring2 = substr($text, floor(strlen($text)/2)); 

if (substr($splitstring1, 0, -1) != ' ' AND substr($splitstring2, 0, 1) != ' ') 
{ 
    $middle = strlen($splitstring1) + strpos($splitstring2, ' ') + 1; 
} 
else 
{ 
    $middle = strrpos(substr($text, 0, floor(strlen($text)/2)), ' ') + 1;  
} 

$string1 = substr($text, 0, $middle); // "The Quick : Brown Fox Jumped " 
$string2 = substr($text, $middle); // "Over The Lazy/Dog" 
+0

Gracias, definitivamente podría ser útil elegir si la primera o segunda cadena obtiene la palabra dividida. En mi proyecto actual me gustaría dar más a string1, y usando mi ejemplo original de 'quick brown fox' tu código funciona como debería, sin embargo, las pruebas con otras cadenas parecen tener resultados mixtos, por ejemplo '$ text =" one two tres cuatro cinco uno dos tres cuatro cinco ";' da como resultado que string1 sea solo 'one two three four'.En cualquier caso, le estoy dando la respuesta porque su primer código hace el trabajo exactamente como lo pedí. – Leo44

+0

En realidad, después de más pruebas, creo que el segundo código funciona como debería, a menos que el medio punto exacto de la cadena sea un espacio. Probablemente eso no ocurra a menudo, así que funcionará bien :) – Leo44

+1

Sugerencia alternativa para dar más a string1: $ middle = strpos ($ name, '', floor (strlen ($ name) * 0.5)); – cmc

6
function split_half($string, $center = 0.4) { 
     $length2 = strlen($string) * $center; 
     $tmp = explode(' ', $string); 
     $index = 0; 
     $result = Array('', ''); 
     foreach($tmp as $word) { 
      if(!$index && strlen($result[0]) > $length2) $index++; 
      $result[$index] .= $word.' '; 
     } 
     return $result; 
} 

Demostración: http://codepad.viper-7.com/I58gcI

+0

Gracias por proporcionar una función con demostración, parece que funciona según lo previsto. – Leo44

+0

Esto funcionó muy bien para mí, ¡gracias! – blizzrdof77

+1

Ninguno de los otros funcionó para mí excepto este. Hice un ligero cambio que corrige el problema de solo 2 palabras, y el segundo es más largo al agregar '' 'if (count ($ tmp) <3) { return $ tmp; } '' 'después de' '' explotar''' –

0

Sólo cambia la línea:

$half = (int)ceil(count($words = (count(explode(" ",$text)))/2); 

str_word_count() puede que no cuente: o/como la palabra.

+0

Desafortunadamente, esto no funcionó, simplemente creó cadenas vacías. También falta un soporte de cierre al final. Pero gracias por intentar :) – Leo44

0
function split_half($string){ 
$result= array(); 
$text = explode(' ', $string); 
$count = count($text); 
$string1 = ''; 
$string2 = ''; 
if($count > 1){ 
    if($count % 2 == 0){ 
     $start = $count/2; 
     $end = $count; 
     for($i=0; $i<$start;$i++){ 
      $string1 .= $text[$i]." "; 
     } 
     for($j=$start; $j<$end;$j++){ 
      $string2 .= $text[$j]." "; 
     }   
    $result[] = $string1; 
    $result[] = $string2; 
    } 
    else{ 
     $start = round($count/2)-1; 
     $end = $count; 
     for($i=0; $i<$start;$i++){ 
      $string1 .= $text[$i]." "; 
     } 
     for($j=$start; $j<$end;$j++){ 
      $string2 .= $text[$j]." "; 
     }   
    $result[] = $string1; 
    $result[] = $string2; 

    } 
} 
else{ 
    $result[] = $string; 
} 
return $result; 
} 

Utilice esta función para dividir cadena en medias palabras ..

0

Me crearon una gran solución, en la que no perdimos personajes o donde la palabra no se corta de manera incorrecta.

function split_title_middle ($title) { 
    $title = strip_tags($title); 
    $middle_length = floor(strlen($title)/2); 
    $new_title = explode('<br />', wordwrap($title, $middle_length, '<br />')); 
    if (isset($new_title[2])) { 
     $new_title[1] .= ' ' . $new_title[2]; 
     unset($new_title[2]); 
    } 

    return $new_title; 
} 

// how to use 
$title = split_title_middle($title); 
echo $title[0] . '<strong>' . $title[1] . '</strong>'; 
Cuestiones relacionadas