2011-11-18 13 views
7

Sto provando a dividere le stringhe a metà e non dovrebbe essere diviso nel mezzo di una parola.Stringhe divise a metà (Word-Aware) con PHP

Finora mi si avvicinò con la seguente, che è il 99% di lavoro:

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

Questo funziona, suddividendo correttamente qualsiasi stringa a metà in base al numero di parole nella stringa. Tuttavia, è la rimozione qualsiasi simbolo nella stringa, ad esempio per l'esempio precedente si visualizzerà:

The Quick Brown Fox Jumped 
Over The Lazy Dog 

devo mantenere tutti i simboli come: e/nella stringa dopo essere stato diviso. Non capisco il motivo per cui il codice attuale sta rimuovendo i simboli ... Se è possibile fornire un metodo alternativo o correggere questo metodo di non rimuovere i simboli, che sarebbe molto apprezzato :)

risposta

17

Osservando l'output di esempio, ho notato che tutti i nostri esempi sono disattivati, stiamo dando meno a string1 se il centro della stringa è all'interno di una parola piuttosto che dare di più.

Ad esempio la metà di The Quick : Brown Fox Jumped Over The Lazy/Dog è The Quick : Brown Fox Ju che si trova nel mezzo di una parola, questo primo esempio restituisce stringa2 la parola divisa; l'esempio in basso dà a string1 la parola divisa.

dare meno di String1 sulla parola scissione

$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" 

dare di più a String1 sulla parola scissione

$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

Grazie, potrebbe essere sicuramente utile scegliere se la prima o la seconda stringa ottiene la parola divisa. Nel mio progetto attuale vorrei dare di più a string1, e usando il mio originale esempio 'quick brown fox' il tuo codice funziona come previsto, tuttavia testare con altre stringhe sembra avere risultati misti, ad esempio '$ text =" one two tre quattro cinque uno due tre quattro cinque ";' risulta che string1 è solo "uno due tre quattro".In ogni caso ti sto dando la risposta perché il tuo primo codice fa il lavoro esattamente come ho chiesto. – Leo44

+0

In realtà, dopo ulteriori test, credo che il secondo codice funzioni come previsto, a meno che il mezzo punto esatto della stringa non sia uno spazio. Probabilmente non succederà spesso, quindi funzionerà benissimo :) – Leo44

+1

Suggerimento alternativo di dare di più 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; 
} 

Demo: http://codepad.viper-7.com/I58gcI

+0

Grazie per aver fornito una funzione con demo, sembra funzionare come previsto. – Leo44

+0

Questo ha funzionato alla grande per me - grazie! – blizzrdof77

+1

Nessuno degli altri ha lavorato per me tranne questo. Ho apportato una leggera modifica che risolve il problema di sole 2 parole, e il secondo è più lungo aggiungendo '' 'if (count ($ tmp) <3) { return $ tmp; } '' 'dopo il' '' explode''' –

0

basta cambiare la linea:

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

str_word_count() non possono contare: o/come parola.

+0

Purtroppo questo non ha funzionato, ha appena creato stringhe vuote. Inoltre manca una staffa di chiusura alla fine. Ma grazie per aver provato :) – 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; 
} 

Usare questa funzione per suddividere stringa in mezze parole ..

0

Mi è stata creata un'ottima soluzione, in cui non perdiamo i caratteri o dove la parola non viene tagliata in modo errato.

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>'; 
Problemi correlati