2016-05-25 27 views
-1

我在數據庫中添加了一些數據。該文本包含英文和阿拉伯文。所以,雖然我需要在網頁上顯示文字,但我試圖將全文分成段落。使用PHP針對「 n」分解時從「 n n」返回的字符是什麼?

  1. 那麼,如果一個段落包含Arabic文字,我在「從右到左」對準一個div顯示文本 。
  2. 如果文本在English中,則顯示在「從左到右」對齊中。

因此,這裏是我下面的代碼:

/*------ Allign text ------*/ 
function align_text($text) 
{ 
    $string = $text; 
    $returnString = ''; 
    $paraArray = explode("\n", $string); 
    if(count($paraArray) > 0) 
    { 
     foreach($paraArray as $pa) 
     { 
      $isRight = $this->is_rtl($pa); 
      if($isRight) 
      { 
       $para['para'] = $pa; 
       $para['align'] = 'R'; 
      } 
      else 
      { 
       $para['para'] = $pa; 
       $para['align'] = 'L'; 
      } 
      $paraArr[] = $para; 
     } 
    } 
    else 
    { 

    } 
    return $paraArr; 
} 

function is_rtl($string) 
{ 
    $rtl_chars_pattern = '/[\x{0590}-\x{05ff}\x{0600}-\x{06ff}]/u'; 
    return preg_match($rtl_chars_pattern, $string); 
} 

現在,這裏的問題。

Array ( 
      [0] => Array ( 
          [para] => This is testing mail. 
          [align] => L) 
      [1] => Array ( 
          [para] => This is testing mail. This is testing mail. This is testing mail. 
          [align] => L) 
      [2] => Array ( 
          [para] => 
          [align] => L) 
      [3] => Array ( 
          [para] => This is testing mail. 
          [align] => L)); 

正如你所看到的,第二行(如果從第0行數)有{ [para] => }。 這是因爲「\ n \ n」,即兩個連續的換行符或<enter>

我到這裏來的角色是什麼?

當試圖顯示這樣的結果,

<?php 
    if(!is_array($row['chatDesc'])) 
    {?> 
     <div class="com-text"> 
      <?php echo $row['chatDesc'];?> 
     </div> 
<?php 
    } 
    else 
    { 
     foreach($row['chatDesc'] as $rC) 
     { 
      echo strlen($rC['para']); 
      if(strlen($rC['para'])==1 && 
       ($rC['para']==null || $rC['para']=="" || $rC['para']==" " || $rC['para']=="\n")) 
      {?> 
       <div class="com-text" style="direction:rtl; clear:both"> 
       [AAA<?php echo $rC['para'];?>AAA] 
       </div> 
     <?php 
      } 
      else if($rC['align']=='R' && $rC['para']!=' ') 
      {?> 
       <div class="com-text" style="direction:rtl; clear:both"> 
        [<?php echo $rC['para'];?>] 
       </div> 
     <?php 
      } 
      else if($rC['align']=='L' && $rC['para']!=' ') 
      {?> 
       <div class="com-text" style="direction:ltr;clear:both"> 
        [<?php echo $rC['para'];?>] 
       </div> 
    <?php } 
     } 
    } ?> 

我無法確定{ [para] => }。 我從來沒有得到這個DIV顯示: -

<div class="com-text" style="direction:rtl; clear:both"> 
[AAA<?php echo $rC['para'];?>AAA] 
</div> 

但是,如果我改變的條件下,

if(strlen($rC['para'])==1 && 
        ($rC['para']==null || $rC['para']=="" || $rC['para']==" " || $rC['para']=="\n")) 

if(strlen($rC['para'])==1),是越來越顯示DIV。

div的內容是[AAA AAA]。 AAA對之間有一個額外的空間。如果這個字符確實是<space>那麼爲什麼if statement中的初始條件不令人滿意?

+0

嘗試使用'CHR()'函數定義符號http://php.net/manual/en/function .chr.php – Justinas

+0

首先使用var_dump()而不是print_r()來查看有關變量類型,長度和內容的更多細節。換句話說''''var_dump($ rC)''''應該爲你提供你所需要的。根據您的源數據,「不可見」字符可能是「\ r」或其他類型的空白字符。 –

+1

可能是'\ r'或空格。 – AbraCadaver

回答

2

我已經試過了你爲\n\n提供的if語句,但它對我來說工作得很好。作爲解決所有空白字符的解決方案,我已經對函數進行了一些重構,以便從段落中刪除任何不必要的空白,並且只有在段落不爲空時纔將其推送到數組。

function align_text($text){ 
    $result = array(); 

    foreach(explode("\n", $text) as $paragraph){ 
     // Remove any whitespace from the beginning and end of the paragraph 
     $paragraph = trim($paragraph); 

     // Only append the paragraph if it's not empty 
     if(strlen($paragraph) > 0) 
      array_push($result, array('para' => $paragraph, 'align' => is_rtl($paragraph) ? 'R' : 'L')); 
    } 

    return $result; 
} 

而你並不需要很多,如果案件在你的HTML顯示您的div:也

<?php foreach($row['chatDesc'] as $rC): ?> 
    <div class="com-text" style="direction:<?php echo $rC['align'] == 'L' ? 'ltr' : 'rtl' ?>;clear:both;"> 
     <?php echo $rC['para']; ?> 
    </div> 
<?php endforeach; ?> 

,如果你只使用align爲格對齊方式,你也可以將它設置直接在您的align_text函數中輸入ltrrtl

array_push($result, array('para' => $paragraph, 'align' => is_rtl($paragraph) ? 'rtl' : 'ltr')); 
在HTML

然後,你可以簡單地附和對齊:

<?php foreach($row['chatDesc'] as $rC): ?> 
<div class="com-text" style="direction:<?php echo $rC['align'] ?>;clear:both;">