1<?php 2 3namespace Sabre\DAV; 4 5/** 6 * String utility 7 * 8 * This class is mainly used to implement the 'text-match' filter, used by both 9 * the CalDAV calendar-query REPORT, and CardDAV addressbook-query REPORT. 10 * Because they both need it, it was decided to put it in Sabre\DAV instead. 11 * 12 * @copyright Copyright (C) fruux GmbH (https://fruux.com/) 13 * @author Evert Pot (http://evertpot.com/) 14 * @license http://sabre.io/license/ Modified BSD License 15 */ 16class StringUtil { 17 18 /** 19 * Checks if a needle occurs in a haystack ;) 20 * 21 * @param string $haystack 22 * @param string $needle 23 * @param string $collation 24 * @param string $matchType 25 * @return bool 26 */ 27 static function textMatch($haystack, $needle, $collation, $matchType = 'contains') { 28 29 switch ($collation) { 30 31 case 'i;ascii-casemap' : 32 // default strtolower takes locale into consideration 33 // we don't want this. 34 $haystack = str_replace(range('a', 'z'), range('A', 'Z'), $haystack); 35 $needle = str_replace(range('a', 'z'), range('A', 'Z'), $needle); 36 break; 37 38 case 'i;octet' : 39 // Do nothing 40 break; 41 42 case 'i;unicode-casemap' : 43 $haystack = mb_strtoupper($haystack, 'UTF-8'); 44 $needle = mb_strtoupper($needle, 'UTF-8'); 45 break; 46 47 default : 48 throw new Exception\BadRequest('Collation type: ' . $collation . ' is not supported'); 49 50 } 51 52 switch ($matchType) { 53 54 case 'contains' : 55 return strpos($haystack, $needle) !== false; 56 case 'equals' : 57 return $haystack === $needle; 58 case 'starts-with' : 59 return strpos($haystack, $needle) === 0; 60 case 'ends-with' : 61 return strrpos($haystack, $needle) === strlen($haystack) - strlen($needle); 62 default : 63 throw new Exception\BadRequest('Match-type: ' . $matchType . ' is not supported'); 64 65 } 66 67 } 68 69 /** 70 * This method takes an input string, checks if it's not valid UTF-8 and 71 * attempts to convert it to UTF-8 if it's not. 72 * 73 * Note that currently this can only convert ISO-8559-1 to UTF-8 (latin-1), 74 * anything else will likely fail. 75 * 76 * @param string $input 77 * @return string 78 */ 79 static function ensureUTF8($input) { 80 81 $encoding = mb_detect_encoding($input, ['UTF-8', 'ISO-8859-1'], true); 82 83 if ($encoding === 'ISO-8859-1') { 84 return utf8_encode($input); 85 } else { 86 return $input; 87 } 88 89 } 90 91} 92