'; $r = ['chr' => [], 'ord' => []]; $chars = preg_split('//', $str, -1); $count = 0; foreach ($chars as $key => $char) { if ($maxCols && $maxCols < $count || $key === count($chars) - 1) { $res .= '
* // Returns "This is a..."
* echo TextExt::maxWords('This is a sentence.', 3);
*
* // Limit the number of words and append a custom ending
* echo Str::words('This is a sentence.', 3, '---');
*
*
* @param string $value
* @param int $words
* @param array $options
* - ellipsis
* - html
* @return string
*/
public static function maxWords($value, $words = 100, array $options = []) {
$defaults = [
'ellipsis' => '...'
];
if (!empty($options['html']) && Configure::read('App.encoding') === 'UTF-8') {
$defaults['ellipsis'] = "\xe2\x80\xa6";
}
$options += $defaults;
if (trim($value) === '') {
return '';
}
preg_match('/^\s*+(?:\S++\s*+){1,' . $words . '}/u', $value, $matches);
$end = $options['ellipsis'];
if (mb_strlen($value) === mb_strlen($matches[0])) {
$end = '';
}
return rtrim($matches[0]) . $end;
}
/**
* High ASCII to Entities
*
* Converts High ascii text and MS Word special characters to character entities
*
* @param string $str
* @return string
*/
public function asciiToEntities($str) {
$count = 1;
$out = '';
$temp = [];
for ($i = 0, $s = strlen($str); $i < $s; $i++) {
$ordinal = ord($str[$i]);
if ($ordinal < 128) {
/*
If the $temp array has a value but we have moved on, then it seems only
fair that we output that entity and restart $temp before continuing. -Paul
*/
if (count($temp) == 1) {
$out .= '' . array_shift($temp) . ';';
$count = 1;
}
$out .= $str[$i];
} else {
if (count($temp) == 0) {
$count = ($ordinal < 224) ? 2 : 3;
}
$temp[] = $ordinal;
if (count($temp) == $count) {
$number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] %
64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);
$out .= '' . $number . ';';
$count = 1;
$temp = [];
}
}
}
return $out;
}
/**
* Entities to ASCII
*
* Converts character entities back to ASCII
*
* @param string $str
* @param bool $all
* @return string
*/
public function entitiesToAscii($str, $all = true) {
if (preg_match_all('/\(\d+)\;/', $str, $matches)) {
for ($i = 0, $s = count($matches['0']); $i < $s; $i++) {
$digits = $matches['1'][$i];
$out = '';
if ($digits < 128) {
$out .= chr($digits);
} elseif ($digits < 2048) {
$out .= chr(192 + (($digits - ($digits % 64)) / 64));
$out .= chr(128 + ($digits % 64));
} else {
$out .= chr(224 + (($digits - ($digits % 4096)) / 4096));
$out .= chr(128 + ((($digits % 4096) - ($digits % 64)) / 64));
$out .= chr(128 + ($digits % 64));
}
$str = str_replace($matches['0'][$i], $out, $str);
}
}
if ($all) {
$str = str_replace(['&', '<', '>', '"', ''', '-'],
['&', '<', '>', '"', "'", '-'], $str);
}
return $str;
}
/**
* Reduce Double Slashes
*
* Converts double slashes in a string to a single slash,
* except those found in http://
*
* http://www.some-site.com//index.php
*
* becomes:
*
* http://www.some-site.com/index.php
*
* @param string $str
* @return string
*/
public function reduce_double_slashes($str) {
return preg_replace('#([^:])//+#', '\\1/', $str);
}
}