2010-07-01 27 views
7

Đây là những gì không làm việc cho tôi:Chuỗi văn bản giới hạn PHP KHÔNG bao gồm thẻ html?

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 
$limited = substr($string, 0, 100).'...'; 
echo $string; 
?> 

Tôi muốn giới hạn văn bản rõ ràng đến 100 ký tự, nhưng sử dụng substr() cũng được bao gồm các văn bản không nhìn thấy được trong giới hạn (<a href="http://www.jackismydog.com"></a>) mà chiếm 41 trong số 100 ký tự có sẵn đó.

Có cách nào giới hạn văn bản sao cho từ "Jack" từ liên kết sẽ được bao gồm trong giới hạn chứ không phải là <a href="http://www.jackismydog.com"> hoặc </a>?

Edit: tôi muốn giữ liên kết trong chuỗi, chỉ không được tính đó là chiều dài đối với giới hạn ..

Trả lời

4

Một chức năng để cắt từ trong HTML:

//+ Jonas Raoni Soares Silva 
//@ http://jsfromhell.com 
function truncate($text, $length, $suffix = '&hellip;', $isHTML = true) { 
    $i = 0; 
    $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); 
    $tags = array(); 
    if($isHTML){ 
     preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 
     foreach($m as $o){ 
      if($o[0][1] - $i >= $length) 
       break; 
      $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); 
      // test if the tag is unpaired, then we mustn't save them 
      if($t[0] != '/' && (!isset($simpleTags[$t]))) 
       $tags[] = $t; 
      elseif(end($tags) == substr($t, 1)) 
       array_pop($tags); 
      $i += $o[1][1] - $o[0][1]; 
     } 
    } 

    // output without closing tags 
    $output = substr($text, 0, $length = min(strlen($text), $length + $i)); 
    // closing tags 
    $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); 

    // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) 
    $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); 
    // Append closing tags to output 
    $output.=$output2; 

    // Get everything until last space 
    $one = substr($output, 0, $pos); 
    // Get the rest 
    $two = substr($output, $pos, (strlen($output) - $pos)); 
    // Extract all tags from the last bit 
    preg_match_all('/<(.*?)>/s', $two, $tags); 
    // Add suffix if needed 
    if (strlen($text) > $length) { $one .= $suffix; } 
    // Re-attach tags 
    $output = $one . implode($tags[0]); 

    //added to remove unnecessary closure 
    $output = str_replace('</!-->','',$output); 

    return $output; 
} 

Nguồn: http://snippets.dzone.com/posts/show/7125

2

Nếu bạn muốn giới hạn một phần văn bản, bạn cần phải phân tích nó và kiểm tra giới hạn bản thân . Cách đơn giản nhất là:

if (strlen(strip_tags($string)) > 100) 
{ 
    // the url inside $url is too big 
} 
else 
{ 
    // the url inside $url fits 
} 
+0

Đừng quên thay thế 'strlen' bằng' mb_strlen' nếu văn bản là multibyte. – machineaddict

2

Không dễ dàng - bạn có thể sử dụng tất nhiên strip_tags để de-htmlise chuỗi, nhưng khác hơn là không có sửa chữa dễ dàng.

+0

Giải pháp cho vấn đề của tôi! Cảm ơn :) – yanike

3

Cách dễ nhất là phân tích cú pháp này thành cấu trúc DOM. Bạn có thể sử dụng DOMDocument cho điều đó. Sau đó, bạn có thể chỉ cần đi qua các yếu tố và thực hiện bất kỳ thay đổi nội dung.

Cách tiếp cận khác là thực hiện tìm kiếm regex hai lần và thay thế - đầu tiên sử dụng regex để tìm nội dung của thẻ, sau đó sử dụng regex để thay thế nội dung bằng nội dung rút gọn. Điều này có thể đạt được với các hàm preg_ * thông thường của bạn.

1

Bạn có thể thử này, làm việc cho tôi, nếu không có thẻ là trong chuỗi $ khác nhau sẽ có giá trị từ 0 hiến $ xâu chuỗi giá trị ban đầu của bạn là 100

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 

$stringall=strlen($string); 
$striphtml = strip_tags($string); 
$stringnohtml=strlen(striphtml); 
$differ=($stringall-$stringnohtml); 
$stringsize=($differ + 100); 
$limited = substr($string, 0, $stringsize).'...'; 
echo $limited; 
?> 
+0

$ stringnohtml = strlen (striphtml); nên là $ stringnohtml = strlen ($ striphtml); – raison

Các vấn đề liên quan