2016-05-25 6 views
-1

Ich habe einige Daten in einem DB hinzugefügt. Der Text enthält sowohl Englisch als auch Arabisch. Also, während ich den Text in der Webseite anzeigen muss, versuche ich den gesamten Text in Absätze zu teilen.Was ist das Zeichen, das von " n n" zurückgegeben wird, wenn es in Bezug auf " n" mit PHP explodiert?

  1. Dann, wenn ein Absatz Arabic Text enthält, bin ich die Anzeige der Text in einem div mit „von rechts nach links“ Ausrichtung.
  2. Wenn sich der Text in English befindet, wird er in der Ausrichtung "von links nach rechts" angezeigt.

Also hier ist mein Code ein:

/*------ 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); 
} 

Nun, hier ist das Problem.

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

Wie Sie sehen können, die zweite Reihe (wenn von der 0. Reihe gezählt) hat { [para] => }. Das liegt an "\ n \ n", d. H. Zwei aufeinanderfolgenden Zeilenumbrüchen oder <enter>.

Was ist der Charakter, den ich hier bekomme?

Beim Versuch, das Ergebnis wie folgt

<?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 } 
     } 
    } ?> 

Ich bin, angezeigt werden nicht in der Lage die { [para] => } zu bestimmen. ich nie bin immer dies angezeigt Div, -

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

Aber wenn ich den Zustand zu ändern,

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

nur if(strlen($rC['para'])==1), die div angezeigt bekommen.

Der Inhalt der div ist [AAA AAA]. Es gibt einen zusätzlichen Abstand zwischen den AAA-Paaren. Wenn dieses Zeichen in der Tat ein <space> ist, warum dann die Anfangsbedingung in der if statement ist nicht befriedigend?

+0

Try 'chr()' Funktion Symbol zu definieren http://php.net/manual/en/function zu verwenden .chr.php – Justinas

+0

Beginnen Sie mit var_dump() anstelle von print_r(), um mehr Details über den Typ, die Länge und den Inhalt der Variablen zu erhalten. Mit anderen Worten: '' '' var_dump ($ rC) '' '' sollte Ihnen das liefern, was Sie brauchen. Abhängig von Ihren Quelldaten kann das "unsichtbare" Zeichen "' '' '' '' '' '' 'oder ein anderer Typ von Leerzeichen sein. –

+1

Könnte '' '' oder Raum sein. – AbraCadaver

Antwort

2

Ich habe versucht, die if-Anweisung, die Sie mit der \n\n zur Verfügung gestellt haben, aber es hat gut für mich funktioniert. Als eine Lösung, die alle Leerraumzeichen korrigiert, habe ich ein Refactoring Ihrer Funktion vorgenommen, um unnötige Leerstellen aus Ihrem Absatz zu entfernen und nur dann in das Array zu schieben, wenn der Absatz nicht leer ist.

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; 
} 

Und Sie brauchen nicht so viele, wenn Fälle Ihre divs in Ihrem HTML angezeigt werden:

<?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; ?> 

Auch, wenn Sie nur die align für die div Ausrichtung verwenden, könnten Sie setzen auch sie zu ltr oder rtl direkt in Ihrer align_text-Funktion.

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

Dann in Ihrem HTML, können Sie einfach Echo der align:

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