Man kennt es auch unter der Bezeichnung Readmore Dilemma. ;o)

Möchte man z.B. in einem Element maximal 200 Zeichen ausgeben, aber nicht mitten im Wort trennen, wird es schwer. Zudem möchte man nicht das nächste Trennzeichen nach dem Offset (maximale Textlänge), sondern das vorherige. 

 

Mit dieser Funktion geht es. Ausserdem kann man alle möglichen Trennzeichen als Array mitschicken. So wird der String bis zu dem Trennzeichen vor dem Offsetvalue extrahiert. und als erster Teil eines Array zurückgegeben. Der restliche String wird im zweiten Teil des Arrays zurückgegeben.

Die Funktion splitString benötigt die zwei anderen Funktionen, diese können natürlich auch einzeln verwendet werden.

 

// find the next position
function strposa($haystack, $needles=array(), $offset=0) {
  $chr = array();
  foreach($needles as $needle) {
    $first = strpos($haystack, $needle, $offset);
    if ($first !== false){
      $chr[$needle] = $first;
    }
  }
  if(empty($chr)){
    return false;
  }
  return min($chr);
}
// find the prev position
function strposz($haystack, $needles=array(), $offset=0) {
  $chr = array();
  foreach($needles as $needle) {
    $first = strripos($haystack, $needle, $offset);
    if ($first !== false){
      $chr[$needle] = $first;
    }
  }
  if(empty($chr)){
    return false;
  }
  return min($chr);
}
// get the string
function splitString($delimiters, $string, $offset){
  $parts = array();
  $firstPos = strposa($string, $delimiters, $offset);
  $start = strlen($string)-$firstPos;
  $prevPos = strposz($string, $delimiters, -$start);
  if(empty($prevPos)){
    $parts[] = substr($string, 0, 49).'-';
    $parts[] = substr($string, 50);
  }else{
    $parts[] = substr($string, 0, $prevPos+1);
    $parts[] = substr($string, $prevPos+1);
  }
  return $parts;
}

$string = 'JetBrians-Donauschiffahrtsunternehmen-Internationalesrecht: der Text ist- aber doof';
$delimiters = array(",",".","|",":"," ","-","/");

$arr = splitString($delimiters, $string, 50);
echo '<pre>';
print_r($arr);
echo '</pre>';