danielebarchiesi@0: TRUE, danielebarchiesi@0: 'ignore words' => array(), danielebarchiesi@0: 'separator' => '-', danielebarchiesi@0: 'replacements' => array(), danielebarchiesi@0: 'transliterate' => FALSE, danielebarchiesi@0: 'reduce ascii' => TRUE, danielebarchiesi@0: 'max length' => FALSE, danielebarchiesi@0: 'lower case' => FALSE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Allow modules to make other changes to the settings. danielebarchiesi@0: if (isset($settings['clean id'])) { danielebarchiesi@0: drupal_alter('ctools_cleanstring_' . $settings['clean id'], $settings); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: drupal_alter('ctools_cleanstring', $settings); danielebarchiesi@0: danielebarchiesi@0: $output = $string; danielebarchiesi@0: danielebarchiesi@0: // Do any replacements the user selected up front. danielebarchiesi@0: if (!empty($settings['replacements'])) { danielebarchiesi@0: $output = strtr($output, $settings['replacements']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Remove slashes if instructed to do so. danielebarchiesi@0: if ($settings['clean slash']) { danielebarchiesi@0: $output = str_replace('/', '', $output); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (!empty($settings['transliterate']) && module_exists('transliteration')) { danielebarchiesi@0: $output = transliteration_get($output); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Reduce to the subset of ASCII96 letters and numbers danielebarchiesi@0: if ($settings['reduce ascii']) { danielebarchiesi@0: $pattern = '/[^a-zA-Z0-9\/]+/'; danielebarchiesi@0: $output = preg_replace($pattern, $settings['separator'], $output); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Get rid of words that are on the ignore list danielebarchiesi@0: if (!empty($settings['ignore words'])) { danielebarchiesi@0: $ignore_re = '\b' . preg_replace('/,/', '\b|\b', $settings['ignore words']) . '\b'; danielebarchiesi@0: danielebarchiesi@0: if (function_exists('mb_eregi_replace')) { danielebarchiesi@0: $output = mb_eregi_replace($ignore_re, '', $output); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $output = preg_replace("/$ignore_re/i", '', $output); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Always replace whitespace with the separator. danielebarchiesi@0: $output = preg_replace('/\s+/', $settings['separator'], $output); danielebarchiesi@0: danielebarchiesi@0: // In preparation for pattern matching, danielebarchiesi@0: // escape the separator if and only if it is not alphanumeric. danielebarchiesi@0: if (isset($settings['separator'])) { danielebarchiesi@0: if (preg_match('/^[^' . CTOOLS_PREG_CLASS_ALNUM . ']+$/uD', $settings['separator'])) { danielebarchiesi@0: $seppattern = $settings['separator']; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $seppattern = '\\' . $settings['separator']; danielebarchiesi@0: } danielebarchiesi@0: // Trim any leading or trailing separators (note the need to danielebarchiesi@0: $output = preg_replace("/^$seppattern+|$seppattern+$/", '', $output); danielebarchiesi@0: danielebarchiesi@0: // Replace multiple separators with a single one danielebarchiesi@0: $output = preg_replace("/$seppattern+/", $settings['separator'], $output); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Enforce the maximum component length danielebarchiesi@0: if (!empty($settings['max length'])) { danielebarchiesi@0: $output = ctools_cleanstring_truncate($output, $settings['max length'], $settings['separator']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (!empty($settings['lower case'])) { danielebarchiesi@0: $output = drupal_strtolower($output); danielebarchiesi@0: } danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * A friendly version of truncate_utf8. danielebarchiesi@0: * danielebarchiesi@0: * @param $string danielebarchiesi@0: * The string to be truncated. danielebarchiesi@0: * @param $length danielebarchiesi@0: * An integer for the maximum desired length. danielebarchiesi@0: * @param $separator danielebarchiesi@0: * A string which contains the word boundary such as - or _. danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * The string truncated below the maxlength. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_cleanstring_truncate($string, $length, $separator) { danielebarchiesi@0: if (drupal_strlen($string) > $length) { danielebarchiesi@0: $string = drupal_substr($string, 0, $length + 1); // leave one more character danielebarchiesi@0: if ($last_break = strrpos($string, $separator)) { // space exists AND is not on position 0 danielebarchiesi@0: $string = substr($string, 0, $last_break); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $string = drupal_substr($string, 0, $length); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return $string; danielebarchiesi@0: }