Textpattern | PHP Cross Reference | Content Management Systems |
Description: StringType object.
1 <?php 2 3 /* 4 * Textpattern Content Management System 5 * https://textpattern.com/ 6 * 7 * Copyright (C) 2020 The Textpattern Development Team 8 * 9 * This file is part of Textpattern. 10 * 11 * Textpattern is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License 13 * as published by the Free Software Foundation, version 2. 14 * 15 * Textpattern is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with Textpattern. If not, see <https://www.gnu.org/licenses/>. 22 */ 23 24 /** 25 * StringType object. 26 * 27 * Wraps around Multibyte string extension, offering multi-byte safe 28 * string functions. 29 * 30 * <code> 31 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->trim()->replace('!', '.')->lower(); 32 * </code> 33 * 34 * @since 4.6.0 35 * @package Type 36 */ 37 38 namespace Textpattern\Type; 39 40 class StringType implements TypeInterface 41 { 42 /** 43 * The string. 44 * 45 * @var string 46 */ 47 48 protected $string; 49 50 /** 51 * Whether multibyte string extension is available. 52 * 53 * @var bool 54 */ 55 56 protected static $mbString = null; 57 58 /** 59 * Whether encoding functions are available. 60 * 61 * @var bool 62 */ 63 64 protected static $encode = null; 65 66 /** 67 * Expected encoding. 68 * 69 * @var string 70 */ 71 72 protected $encoding = 'UTF-8'; 73 74 /** 75 * Constructor. 76 * 77 * @param string $string The string 78 */ 79 80 public function __construct($string) 81 { 82 $this->string = (string)$string; 83 84 if (self::$mbString === null) { 85 self::$mbString = function_exists('mb_strlen'); 86 } 87 88 if (self::$encode === null) { 89 self::$encode = function_exists('utf8_decode'); 90 } 91 } 92 93 /** 94 * Gets the string. 95 * 96 * <code> 97 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!'); 98 * </code> 99 * 100 * @return string 101 * @see \Textpattern\Type\String::getString() 102 */ 103 104 public function __toString() 105 { 106 return (string)$this->string; 107 } 108 109 /** 110 * Gets the string. 111 * 112 * <code> 113 * echo Txp::get('\Textpattern\Type\StringType', 'Hello World!')->getString(); 114 * </code> 115 * 116 * @return string 117 * @see \Textpattern\Type\String::_toString() 118 */ 119 120 public function getString() 121 { 122 return (string)$this->string; 123 } 124 125 /** 126 * Gets string length. 127 * 128 * <code> 129 * echo Txp::get('\Textpattern\Type\StringType', 'Hello World!')->getLength(); 130 * </code> 131 * 132 * @return int 133 */ 134 135 public function getLength() 136 { 137 if (self::$mbString) { 138 return mb_strlen($this->string, $this->encoding); 139 } 140 141 if (self::$encode) { 142 return strlen(utf8_decode($this->string)); 143 } 144 145 return strlen($this->string); 146 } 147 148 /** 149 * Finds the first occurrence of a string in the string. 150 * 151 * <code> 152 * echo Txp::get('\Textpattern\Type\StringType', '#@language')->position('@'); 153 * </code> 154 * 155 * @param string $needle The string to find 156 * @param int $offset The search offset 157 * @return int|bool FALSE if the string does not contain results 158 */ 159 160 public function position($needle, $offset = 0) 161 { 162 if (self::$mbString) { 163 return mb_strpos($this->string, $needle, $offset, $this->encoding); 164 } 165 166 return strpos($this->string, $needle, $offset); 167 } 168 169 /** 170 * Gets substring count. 171 * 172 * <code> 173 * echo Txp::get('\Textpattern\Type\StringType', 'Hello World!')->count('ello'); 174 * </code> 175 * 176 * @param string $needle The string to find 177 * @return int 178 */ 179 180 public function count($needle) 181 { 182 if (self::$mbString) { 183 return mb_substr_count($this->string, $needle, $this->encoding); 184 } 185 186 return substr_count($this->string, $needle); 187 } 188 189 /** 190 * Converts the string to a callback. 191 * 192 * <code> 193 * Txp::get('\Textpattern\Type\StringType', '\Textpattern\Password\Hash->hash')->toCallback(); 194 * </code> 195 * 196 * @return mixed Callable 197 */ 198 199 public function toCallback() 200 { 201 $callback = $this->string; 202 203 if (strpos($this->string, '->')) { 204 $callback = explode('->', $this->string); 205 206 if (class_exists($callback[0])) { 207 $callback[0] = new $callback[0]; 208 } 209 } elseif (strpos($this->string, '::')) { 210 $callback = explode('::', $this->string); 211 } 212 213 return $callback; 214 } 215 216 /** 217 * Add slashes. 218 * 219 * <code> 220 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Some "content" to slash.')->addSlashes(); 221 * </code> 222 * 223 * @return StringType 224 */ 225 226 public function addSlashes() 227 { 228 $this->string = addslashes($this->string); 229 230 return $this; 231 } 232 233 /** 234 * HTML encodes the string. 235 * 236 * <code> 237 * echo (string) Txp::get('\Textpattern\Type\StringType', '<strong>Hello World!</strong>')->html(); 238 * </code> 239 * 240 * @param int $flags A bitmask of one or more flags. The default is ENT_QUOTES 241 * @param bool $double_encode When double_encode is turned off PHP will not encode existing HTML entities, the default is to convert everything 242 * @return StringType 243 */ 244 245 public function html($flags = ENT_QUOTES, $double_encode = true) 246 { 247 $this->string = htmlspecialchars($this->string, $flags, $this->encoding, $double_encode); 248 249 return $this; 250 } 251 252 /** 253 * Splits part of the string. 254 * 255 * <code> 256 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->substring(2, 5); 257 * </code> 258 * 259 * @param int $start The start 260 * @param int $length The length 261 * @return StringType 262 */ 263 264 public function substring($start, $length = null) 265 { 266 if (self::$mbString) { 267 $this->string = mb_substr($this->string, $start, $length, $this->encoding); 268 } else { 269 $this->string = substr($this->string, $start, $length); 270 } 271 272 return $this; 273 } 274 275 /** 276 * Replaces all occurrences with replacements. 277 * 278 * <code> 279 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->replace('!', '.'); 280 * </code> 281 * 282 * @param mixed $from The needle to find 283 * @param mixed $to The replacement 284 * @return StringType 285 */ 286 287 public function replace($from, $to) 288 { 289 $this->string = str_replace($from, $to, $this->string); 290 291 return $this; 292 } 293 294 /** 295 * Translates substrings. 296 * 297 * <code> 298 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Article <strong>{title}</strong> deleted.') 299 * ->tr('{title}', 'Hello {title} variable.'); 300 * </code> 301 * 302 * @param string $from StringType to find 303 * @param string $to The replacement 304 * @return StringType 305 */ 306 307 public function tr($from, $to = null) 308 { 309 $this->string = strtr($this->string, $from, $to); 310 311 return $this; 312 } 313 314 /** 315 * Trims surrounding whitespace or other characters. 316 * 317 * <code> 318 * echo (string) Txp::get('\Textpattern\Type\StringType', ' Hello World! ')->trim(); 319 * </code> 320 * 321 * @param string $characters Character list 322 * @return StringType 323 */ 324 325 public function trim($characters = "\t\n\r\0\x0B") 326 { 327 $this->string = trim($this->string, $characters); 328 329 return $this; 330 } 331 332 /** 333 * Trims whitespace or other characters from the beginning. 334 * 335 * <code> 336 * echo (string) Txp::get('\Textpattern\Type\StringType', ' Hello World! ')->ltrim(); 337 * </code> 338 * 339 * @param string $characters Character list 340 * @return StringType 341 */ 342 343 public function ltrim($characters = "\t\n\r\0\x0B") 344 { 345 $this->string = ltrim($this->string, $characters); 346 347 return $this; 348 } 349 350 /** 351 * Trims whitespace or other characters from the end. 352 * 353 * <code> 354 * echo (string) Txp::get('\Textpattern\Type\StringType', ' Hello World! ')->rtrim(); 355 * </code> 356 * 357 * @param string $characters Character list 358 * @return StringType 359 */ 360 361 public function rtrim($characters = "\t\n\r\0\x0B") 362 { 363 $this->string = rtrim($this->string, $characters); 364 365 return $this; 366 } 367 368 /** 369 * Splits string to chunks. 370 * 371 * <code> 372 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->chunk(1); 373 * </code> 374 * 375 * @param int $length The chunk length 376 * @param string $delimiter The delimiter 377 * @return StringType 378 */ 379 380 public function chunk($length = 76, $delimiter = n) 381 { 382 $this->string = chunk_split($this->string, $length, $delimiter); 383 384 return $this; 385 } 386 387 /** 388 * Word wraps the string. 389 * 390 * <code> 391 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->wordWrap(); 392 * </code> 393 * 394 * @param int $length The line length 395 * @param string $delimiter The line delimiter 396 * @param bool $cut Cut off words 397 * @return StringType 398 */ 399 400 public function wordWrap($length = 75, $delimiter = n, $cut = false) 401 { 402 $this->string = wordwrap($this->string, $length, $delimiter, $cut); 403 404 return $this; 405 } 406 407 /** 408 * Converts the string to lowercase. 409 * 410 * <code> 411 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->lower(); 412 * </code> 413 * 414 * @return StringType 415 */ 416 417 public function lower() 418 { 419 if (self::$mbString) { 420 $this->string = mb_strtolower($this->string, $this->encoding); 421 } else { 422 $this->string = strtolower($this->string); 423 } 424 425 return $this; 426 } 427 428 /** 429 * Converts the string to uppercase. 430 * 431 * <code> 432 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->upper(); 433 * </code> 434 * 435 * @return StringType 436 */ 437 438 public function upper() 439 { 440 if (self::$mbString) { 441 $this->string = mb_strtoupper($this->string, $this->encoding); 442 } else { 443 $this->string = strtoupper($this->string); 444 } 445 446 return $this; 447 } 448 449 /** 450 * Converts the string to titlecase. 451 * 452 * <code> 453 * echo (string) Txp::get('\Textpattern\Type\StringType', 'hello world!')->title(); 454 * </code> 455 * 456 * @return StringType 457 */ 458 459 public function title() 460 { 461 if (self::$mbString) { 462 $this->string = mb_convert_case($this->string, MB_CASE_TITLE, $this->encoding); 463 } else { 464 $this->string = ucwords($this->string); 465 } 466 467 return $this; 468 } 469 470 /** 471 * Uppercase the first letter. 472 * 473 * <code> 474 * echo (string) Txp::get('\Textpattern\Type\StringType', 'Hello World!')->ucfirst(); 475 * </code> 476 * 477 * @return StringType 478 */ 479 480 public function ucfirst() 481 { 482 if (self::$mbString) { 483 $this->string = 484 mb_strtoupper(mb_substr($this->string, 0, 1, $this->encoding), $this->encoding). 485 mb_substr($this->string, 1, null, $this->encoding); 486 } else { 487 $this->string = ucfirst($this->string); 488 } 489 490 return $this; 491 } 492 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
title