2011-11-18 35 views
7

Tôi đang cố gắng tách các chuỗi thành một nửa và không được phân tách ở giữa một từ.Tách các chuỗi bằng một nửa (Word-Aware) với PHP

Cho đến nay tôi đã đưa ra những điều sau đây là 99% làm việc:

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

này không làm việc, đúng tách bất kỳ chuỗi trong nửa theo số từ trong chuỗi. Tuy nhiên, nó là loại bỏ bất kỳ biểu tượng trong chuỗi, ví dụ cho ví dụ trên nó sẽ ra:

The Quick Brown Fox Jumped 
Over The Lazy Dog 

tôi cần phải giữ tất cả những biểu tượng như: và/trong chuỗi sau khi chia tay. Tôi không hiểu tại sao các mã hiện tại là loại bỏ những biểu tượng ... Nếu bạn có thể cung cấp một phương pháp thay thế hoặc sửa chữa phương pháp này để không loại bỏ các biểu tượng, nó sẽ được đánh giá rất nhiều :)

Trả lời

17

Khi xem xét kết quả ví dụ của bạn, tôi nhận thấy tất cả các ví dụ của chúng tôi bị tắt, chúng tôi sẽ cung cấp ít hơn cho chuỗi1 nếu giữa chuỗi nằm trong một từ thay vì cho nhiều hơn.

Ví dụ: giữa The Quick : Brown Fox Jumped Over The Lazy/DogThe Quick : Brown Fox Ju nằm ở giữa một từ, ví dụ đầu tiên này cho chuỗi2 từ tách rời; ví dụ dưới cùng cho chuỗi1 từ tách biệt.

Cho ít hơn để chuỗi1 trên từ chia

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

Give hơn để chuỗi1 trên từ chia

$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

Cảm ơn, nó chắc chắn có thể hữu ích để chọn xem chuỗi đầu tiên hay chuỗi thứ hai có được từ tách rời hay không. Trong dự án hiện tại của tôi, tôi muốn cung cấp nhiều hơn cho string1 và sử dụng ví dụ 'fox brown fox' ban đầu của bạn, mã của bạn hoạt động như dự định, tuy nhiên việc kiểm tra với các chuỗi khác dường như có kết quả khác nhau, ví dụ '$ text =" ba bốn năm một hai ba bốn năm ";' kết quả trong chuỗi1 là chỉ 'một hai ba bốn'.Trong mọi trường hợp, tôi sẽ trao cho bạn câu trả lời vì mã đầu tiên của bạn thực hiện công việc chính xác như tôi đã hỏi. – Leo44

+0

Thực ra sau khi thử nghiệm thêm, tôi tin rằng mã thứ hai không hoạt động như dự định, trừ khi điểm chính xác của chuỗi là một khoảng trắng. Điều đó có lẽ sẽ không xảy ra thường xuyên vì vậy nó sẽ làm việc tốt :) – Leo44

+1

Đề nghị thay thế để cung cấp cho nhiều hơn để string1: $ giữa = strpos ($ name, '', sàn (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

Cảm ơn bạn đã cung cấp chức năng với bản trình diễn, có vẻ như nó hoạt động như dự định. – Leo44

+0

Điều này làm việc tuyệt vời cho tôi - cảm ơn! – blizzrdof77

+1

Không ai trong số những người khác làm việc cho tôi ngoại trừ cái này. Tôi đã thực hiện một thay đổi nhỏ để khắc phục sự cố chỉ có 2 từ và thứ hai là dài hơn bằng cách thêm '' 'nếu (đếm ($ tmp) <3) { trả về $ tmp; } '' 'sau khi' '' phát nổ''' –

0

Chỉ cần thay đổi dòng:

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

str_word_count() không thể đếm: hoặc/như lời.

+0

Thật không may điều này đã không làm việc, nó chỉ tạo ra chuỗi rỗng. Ngoài ra nó thiếu một khung đóng ở cuối. Nhưng cảm ơn vì đã cố gắng :) – 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; 
} 

Sử dụng chức năng này để chia chuỗi thành từ nửa ..

0

Tôi đã được tạo ra một giải pháp tuyệt vời, nơi chúng tôi không bị mất nhân vật hoặc từ đâu không được cắt sai.

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>'; 
Các vấn đề liên quan