2004-02-09 01:57:02 -05:00
< ? php
function wptexturize ( $text ) {
2004-04-22 03:41:57 -04:00
$output = '' ;
// Capture tags and everything inside them
$textarr = preg_split ( " /(<.*>)/Us " , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE );
2004-02-09 01:57:02 -05:00
$stop = count ( $textarr ); $next = true ; // loop stuff
for ( $i = 0 ; $i < $stop ; $i ++ ) {
$curl = $textarr [ $i ];
2004-02-15 22:02:25 -05:00
2004-02-09 01:57:02 -05:00
if ( isset ( $curl { 0 }) && '<' != $curl { 0 } && $next ) { // If it's not a tag
$curl = str_replace ( '---' , '—' , $curl );
2005-05-01 15:21:42 -04:00
$curl = str_replace ( ' -- ' , ' — ' , $curl );
2004-02-09 01:57:02 -05:00
$curl = str_replace ( '--' , '–' , $curl );
2005-05-01 15:21:42 -04:00
$curl = str_replace ( 'xn–' , 'xn--' , $curl );
2004-09-04 16:47:52 -04:00
$curl = str_replace ( '...' , '…' , $curl );
2004-02-09 01:57:02 -05:00
$curl = str_replace ( '``' , '“' , $curl );
// This is a hack, look at this more later. It works pretty well though.
2005-03-29 10:19:50 -05:00
$cockney = array ( " 'tain't " , " 'twere " , " 'twas " , " 'tis " , " 'twill " , " 'til " , " 'bout " , " 'nuff " , " 'round " , " 'cause " );
$cockneyreplace = array ( " ’tain’t " , " ’twere " , " ’twas " , " ’tis " , " ’twill " , " ’til " , " ’bout " , " ’nuff " , " ’round " , " ’cause " );
2004-02-09 01:57:02 -05:00
$curl = str_replace ( $cockney , $cockneyreplace , $curl );
2004-03-21 20:34:32 -05:00
$curl = preg_replace ( " /'s/ " , '’s' , $curl );
2004-02-09 01:57:02 -05:00
$curl = preg_replace ( " /'( \ d \ d(?:’|')?s)/ " , " ’ $ 1 " , $curl );
$curl = preg_replace ( '/(\s|\A|")\'/' , '$1‘' , $curl );
2004-06-11 13:52:41 -04:00
$curl = preg_replace ( '/(\d+)"/' , '$1″' , $curl );
$curl = preg_replace ( " /( \ d+)'/ " , '$1′' , $curl );
2004-02-09 01:57:02 -05:00
$curl = preg_replace ( " /( \ S)'([^' \ s])/ " , " $ 1’ $ 2 " , $curl );
2004-03-21 20:34:32 -05:00
$curl = preg_replace ( '/(\s|\A)"(?!\s)/' , '$1“$2' , $curl );
2004-09-04 16:47:52 -04:00
$curl = preg_replace ( '/"(\s|\S|\Z)/' , '”$1' , $curl );
2004-02-09 01:57:02 -05:00
$curl = preg_replace ( " /'([ \ s.]| \ Z)/ " , '’$1' , $curl );
2004-09-04 16:47:52 -04:00
$curl = preg_replace ( " / \ (tm \ )/i " , ' ™' , $curl );
2004-02-09 01:57:02 -05:00
$curl = str_replace ( " '' " , '”' , $curl );
2006-02-12 02:53:23 -05:00
2005-04-18 23:41:22 -04:00
$curl = preg_replace ( '/(\d+)x(\d+)/' , " $ 1× $ 2 " , $curl );
2004-02-09 01:57:02 -05:00
} elseif ( strstr ( $curl , '<code' ) || strstr ( $curl , '<pre' ) || strstr ( $curl , '<kbd' || strstr ( $curl , '<style' ) || strstr ( $curl , '<script' ))) {
// strstr is fast
$next = false ;
} else {
$next = true ;
}
2006-04-03 20:47:33 -04:00
$curl = preg_replace ( '/&([^#])(?![a-zA-Z1-4]{1,8};)/' , '&$1' , $curl );
2004-02-09 01:57:02 -05:00
$output .= $curl ;
}
return $output ;
}
2004-03-21 02:07:55 -05:00
function clean_pre ( $text ) {
$text = str_replace ( '<br />' , '' , $text );
2005-01-06 05:10:55 -05:00
$text = str_replace ( '<p>' , " \n " , $text );
$text = str_replace ( '</p>' , '' , $text );
2004-03-21 02:07:55 -05:00
return $text ;
}
2004-02-09 01:57:02 -05:00
function wpautop ( $pee , $br = 1 ) {
$pee = $pee . " \n " ; // just to make things a little easier, pad the end
$pee = preg_replace ( '|<br />\s*<br />|' , " \n \n " , $pee );
2004-04-22 03:41:57 -04:00
// Space things out a little
2005-05-03 18:31:20 -04:00
$pee = preg_replace ( '!(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!' , " \n $ 1 " , $pee );
2005-12-05 12:00:01 -05:00
$pee = preg_replace ( '!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)!' , " $ 1 \n \n " , $pee );
2004-04-22 03:41:57 -04:00
$pee = str_replace ( array ( " \r \n " , " \r " ), " \n " , $pee ); // cross-platform newlines
2004-02-09 01:57:02 -05:00
$pee = preg_replace ( " / \n \n +/ " , " \n \n " , $pee ); // take care of duplicates
2005-11-17 12:47:29 -05:00
$pee = preg_replace ( '/\n?(.+?)(?:\n\s*\n|\z)/s' , " <p> $ 1</p> \n " , $pee ); // make paragraphs, including one at the end
2004-02-09 01:57:02 -05:00
$pee = preg_replace ( '|<p>\s*?</p>|' , '' , $pee ); // under certain strange conditions it could create a P of entirely whitespace
2005-12-05 12:00:01 -05:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!' , " $ 1 " , $pee ); // don't pee all over a tag
2004-02-09 01:57:02 -05:00
$pee = preg_replace ( " |<p>(<li.+?)</p>| " , " $ 1 " , $pee ); // problem with nested lists
$pee = preg_replace ( '|<p><blockquote([^>]*)>|i' , " <blockquote $ 1><p> " , $pee );
$pee = str_replace ( '</blockquote></p>' , '</p></blockquote>' , $pee );
2005-05-03 18:31:20 -04:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!' , " $ 1 " , $pee );
$pee = preg_replace ( '!(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!' , " $ 1 " , $pee );
2006-07-04 19:16:04 -04:00
if ( $br ) {
$pee = preg_replace ( '/<(script|style).*?<\/\\1>/se' , 'str_replace("\n", "<WPPreserveNewline />", "\\0")' , $pee );
$pee = preg_replace ( '|(?<!<br />)\s*\n|' , " <br /> \n " , $pee ); // optionally make line breaks
$pee = str_replace ( '<WPPreserveNewline />' , " \n " , $pee );
}
2005-05-03 18:31:20 -04:00
$pee = preg_replace ( '!(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*<br />!' , " $ 1 " , $pee );
2006-09-06 20:33:05 -04:00
$pee = preg_replace ( '!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!' , '$1' , $pee );
2005-11-10 21:16:26 -05:00
$pee = preg_replace ( '!(<pre.*?>)(.*?)</pre>!ise' , " stripslashes(' $ 1') . stripslashes(clean_pre(' $ 2')) . '</pre>' " , $pee );
2006-02-12 02:53:23 -05:00
2004-02-09 01:57:02 -05:00
return $pee ;
}
2004-05-22 10:34:09 -04:00
function seems_utf8 ( $Str ) { # by bmorel at ssi dot fr
for ( $i = 0 ; $i < strlen ( $Str ); $i ++ ) {
if ( ord ( $Str [ $i ]) < 0x80 ) continue ; # 0bbbbbbb
elseif (( ord ( $Str [ $i ]) & 0xE0 ) == 0xC0 ) $n = 1 ; # 110bbbbb
elseif (( ord ( $Str [ $i ]) & 0xF0 ) == 0xE0 ) $n = 2 ; # 1110bbbb
elseif (( ord ( $Str [ $i ]) & 0xF8 ) == 0xF0 ) $n = 3 ; # 11110bbb
elseif (( ord ( $Str [ $i ]) & 0xFC ) == 0xF8 ) $n = 4 ; # 111110bb
elseif (( ord ( $Str [ $i ]) & 0xFE ) == 0xFC ) $n = 5 ; # 1111110b
else return false ; # Does not match any model
for ( $j = 0 ; $j < $n ; $j ++ ) { # n bytes matching 10bbbbbb follow ?
if (( ++ $i == strlen ( $Str )) || (( ord ( $Str [ $i ]) & 0xC0 ) != 0x80 ))
return false ;
}
}
return true ;
}
2004-12-12 15:41:19 -05:00
function wp_specialchars ( $text , $quotes = 0 ) {
// Like htmlspecialchars except don't double-encode HTML entities
2006-03-31 03:32:30 -05:00
$text = preg_replace ( '/&([^#])(?![a-z1-4]{1,8};)/' , '&$1' , $text );
2004-12-12 15:41:19 -05:00
$text = str_replace ( '<' , '<' , $text );
$text = str_replace ( '>' , '>' , $text );
2006-03-28 20:51:55 -05:00
if ( 'double' === $quotes ) {
$text = str_replace ( '"' , '"' , $text );
2006-04-17 19:33:08 -04:00
} elseif ( 'single' === $quotes ) {
$text = str_replace ( " ' " , ''' , $text );
2006-03-28 20:51:55 -05:00
} elseif ( $quotes ) {
2004-12-12 15:41:19 -05:00
$text = str_replace ( '"' , '"' , $text );
2004-12-25 12:21:43 -05:00
$text = str_replace ( " ' " , ''' , $text );
2004-12-12 15:41:19 -05:00
}
return $text ;
}
2004-09-10 04:36:54 -04:00
function utf8_uri_encode ( $utf8_string ) {
$unicode = '' ;
$values = array ();
$num_octets = 1 ;
for ( $i = 0 ; $i < strlen ( $utf8_string ); $i ++ ) {
$value = ord ( $utf8_string [ $i ] );
if ( $value < 128 ) {
$unicode .= chr ( $value );
} else {
if ( count ( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3 ;
$values [] = $value ;
if ( count ( $values ) == $num_octets ) {
if ( $num_octets == 3 ) {
$unicode .= '%' . dechex ( $values [ 0 ]) . '%' . dechex ( $values [ 1 ]) . '%' . dechex ( $values [ 2 ]);
} else {
$unicode .= '%' . dechex ( $values [ 0 ]) . '%' . dechex ( $values [ 1 ]);
}
$values = array ();
$num_octets = 1 ;
}
}
}
return $unicode ;
}
2004-05-22 10:34:09 -04:00
function remove_accents ( $string ) {
2006-07-26 18:55:36 -04:00
if ( ! preg_match ( '/[\x80-\xff]/' , $string ) )
return $string ;
2004-05-22 10:34:09 -04:00
if ( seems_utf8 ( $string )) {
2005-03-28 20:38:29 -05:00
$chars = array (
// Decompositions for Latin-1 Supplement
chr ( 195 ) . chr ( 128 ) => 'A' , chr ( 195 ) . chr ( 129 ) => 'A' ,
chr ( 195 ) . chr ( 130 ) => 'A' , chr ( 195 ) . chr ( 131 ) => 'A' ,
chr ( 195 ) . chr ( 132 ) => 'A' , chr ( 195 ) . chr ( 133 ) => 'A' ,
chr ( 195 ) . chr ( 135 ) => 'C' , chr ( 195 ) . chr ( 136 ) => 'E' ,
chr ( 195 ) . chr ( 137 ) => 'E' , chr ( 195 ) . chr ( 138 ) => 'E' ,
chr ( 195 ) . chr ( 139 ) => 'E' , chr ( 195 ) . chr ( 140 ) => 'I' ,
chr ( 195 ) . chr ( 141 ) => 'I' , chr ( 195 ) . chr ( 142 ) => 'I' ,
chr ( 195 ) . chr ( 143 ) => 'I' , chr ( 195 ) . chr ( 145 ) => 'N' ,
chr ( 195 ) . chr ( 146 ) => 'O' , chr ( 195 ) . chr ( 147 ) => 'O' ,
chr ( 195 ) . chr ( 148 ) => 'O' , chr ( 195 ) . chr ( 149 ) => 'O' ,
chr ( 195 ) . chr ( 150 ) => 'O' , chr ( 195 ) . chr ( 153 ) => 'U' ,
chr ( 195 ) . chr ( 154 ) => 'U' , chr ( 195 ) . chr ( 155 ) => 'U' ,
chr ( 195 ) . chr ( 156 ) => 'U' , chr ( 195 ) . chr ( 157 ) => 'Y' ,
chr ( 195 ) . chr ( 159 ) => 's' , chr ( 195 ) . chr ( 160 ) => 'a' ,
chr ( 195 ) . chr ( 161 ) => 'a' , chr ( 195 ) . chr ( 162 ) => 'a' ,
chr ( 195 ) . chr ( 163 ) => 'a' , chr ( 195 ) . chr ( 164 ) => 'a' ,
chr ( 195 ) . chr ( 165 ) => 'a' , chr ( 195 ) . chr ( 167 ) => 'c' ,
chr ( 195 ) . chr ( 168 ) => 'e' , chr ( 195 ) . chr ( 169 ) => 'e' ,
chr ( 195 ) . chr ( 170 ) => 'e' , chr ( 195 ) . chr ( 171 ) => 'e' ,
chr ( 195 ) . chr ( 172 ) => 'i' , chr ( 195 ) . chr ( 173 ) => 'i' ,
chr ( 195 ) . chr ( 174 ) => 'i' , chr ( 195 ) . chr ( 175 ) => 'i' ,
chr ( 195 ) . chr ( 177 ) => 'n' , chr ( 195 ) . chr ( 178 ) => 'o' ,
chr ( 195 ) . chr ( 179 ) => 'o' , chr ( 195 ) . chr ( 180 ) => 'o' ,
2005-03-28 22:12:24 -05:00
chr ( 195 ) . chr ( 181 ) => 'o' , chr ( 195 ) . chr ( 182 ) => 'o' ,
chr ( 195 ) . chr ( 182 ) => 'o' , chr ( 195 ) . chr ( 185 ) => 'u' ,
chr ( 195 ) . chr ( 186 ) => 'u' , chr ( 195 ) . chr ( 187 ) => 'u' ,
chr ( 195 ) . chr ( 188 ) => 'u' , chr ( 195 ) . chr ( 189 ) => 'y' ,
2005-03-28 20:38:29 -05:00
chr ( 195 ) . chr ( 191 ) => 'y' ,
// Decompositions for Latin Extended-A
2005-03-28 22:12:24 -05:00
chr ( 196 ) . chr ( 128 ) => 'A' , chr ( 196 ) . chr ( 129 ) => 'a' ,
chr ( 196 ) . chr ( 130 ) => 'A' , chr ( 196 ) . chr ( 131 ) => 'a' ,
chr ( 196 ) . chr ( 132 ) => 'A' , chr ( 196 ) . chr ( 133 ) => 'a' ,
2005-11-16 01:37:06 -05:00
chr ( 196 ) . chr ( 134 ) => 'C' , chr ( 196 ) . chr ( 135 ) => 'c' ,
2005-03-28 22:12:24 -05:00
chr ( 196 ) . chr ( 136 ) => 'C' , chr ( 196 ) . chr ( 137 ) => 'c' ,
chr ( 196 ) . chr ( 138 ) => 'C' , chr ( 196 ) . chr ( 139 ) => 'c' ,
chr ( 196 ) . chr ( 140 ) => 'C' , chr ( 196 ) . chr ( 141 ) => 'c' ,
chr ( 196 ) . chr ( 142 ) => 'D' , chr ( 196 ) . chr ( 143 ) => 'd' ,
chr ( 196 ) . chr ( 144 ) => 'D' , chr ( 196 ) . chr ( 145 ) => 'd' ,
chr ( 196 ) . chr ( 146 ) => 'E' , chr ( 196 ) . chr ( 147 ) => 'e' ,
chr ( 196 ) . chr ( 148 ) => 'E' , chr ( 196 ) . chr ( 149 ) => 'e' ,
chr ( 196 ) . chr ( 150 ) => 'E' , chr ( 196 ) . chr ( 151 ) => 'e' ,
chr ( 196 ) . chr ( 152 ) => 'E' , chr ( 196 ) . chr ( 153 ) => 'e' ,
chr ( 196 ) . chr ( 154 ) => 'E' , chr ( 196 ) . chr ( 155 ) => 'e' ,
chr ( 196 ) . chr ( 156 ) => 'G' , chr ( 196 ) . chr ( 157 ) => 'g' ,
chr ( 196 ) . chr ( 158 ) => 'G' , chr ( 196 ) . chr ( 159 ) => 'g' ,
chr ( 196 ) . chr ( 160 ) => 'G' , chr ( 196 ) . chr ( 161 ) => 'g' ,
chr ( 196 ) . chr ( 162 ) => 'G' , chr ( 196 ) . chr ( 163 ) => 'g' ,
chr ( 196 ) . chr ( 164 ) => 'H' , chr ( 196 ) . chr ( 165 ) => 'h' ,
chr ( 196 ) . chr ( 166 ) => 'H' , chr ( 196 ) . chr ( 167 ) => 'h' ,
chr ( 196 ) . chr ( 168 ) => 'I' , chr ( 196 ) . chr ( 169 ) => 'i' ,
chr ( 196 ) . chr ( 170 ) => 'I' , chr ( 196 ) . chr ( 171 ) => 'i' ,
chr ( 196 ) . chr ( 172 ) => 'I' , chr ( 196 ) . chr ( 173 ) => 'i' ,
chr ( 196 ) . chr ( 174 ) => 'I' , chr ( 196 ) . chr ( 175 ) => 'i' ,
chr ( 196 ) . chr ( 176 ) => 'I' , chr ( 196 ) . chr ( 177 ) => 'i' ,
chr ( 196 ) . chr ( 178 ) => 'IJ' , chr ( 196 ) . chr ( 179 ) => 'ij' ,
chr ( 196 ) . chr ( 180 ) => 'J' , chr ( 196 ) . chr ( 181 ) => 'j' ,
chr ( 196 ) . chr ( 182 ) => 'K' , chr ( 196 ) . chr ( 183 ) => 'k' ,
chr ( 196 ) . chr ( 184 ) => 'k' , chr ( 196 ) . chr ( 185 ) => 'L' ,
chr ( 196 ) . chr ( 186 ) => 'l' , chr ( 196 ) . chr ( 187 ) => 'L' ,
chr ( 196 ) . chr ( 188 ) => 'l' , chr ( 196 ) . chr ( 189 ) => 'L' ,
chr ( 196 ) . chr ( 190 ) => 'l' , chr ( 196 ) . chr ( 191 ) => 'L' ,
2005-11-16 01:37:06 -05:00
chr ( 197 ) . chr ( 128 ) => 'l' , chr ( 197 ) . chr ( 129 ) => 'L' ,
chr ( 197 ) . chr ( 130 ) => 'l' , chr ( 197 ) . chr ( 131 ) => 'N' ,
chr ( 197 ) . chr ( 132 ) => 'n' , chr ( 197 ) . chr ( 133 ) => 'N' ,
chr ( 197 ) . chr ( 134 ) => 'n' , chr ( 197 ) . chr ( 135 ) => 'N' ,
chr ( 197 ) . chr ( 136 ) => 'n' , chr ( 197 ) . chr ( 137 ) => 'N' ,
chr ( 197 ) . chr ( 138 ) => 'n' , chr ( 197 ) . chr ( 139 ) => 'N' ,
chr ( 197 ) . chr ( 140 ) => 'O' , chr ( 197 ) . chr ( 141 ) => 'o' ,
chr ( 197 ) . chr ( 142 ) => 'O' , chr ( 197 ) . chr ( 143 ) => 'o' ,
chr ( 197 ) . chr ( 144 ) => 'O' , chr ( 197 ) . chr ( 145 ) => 'o' ,
2005-03-28 22:12:24 -05:00
chr ( 197 ) . chr ( 146 ) => 'OE' , chr ( 197 ) . chr ( 147 ) => 'oe' ,
chr ( 197 ) . chr ( 148 ) => 'R' , chr ( 197 ) . chr ( 149 ) => 'r' ,
chr ( 197 ) . chr ( 150 ) => 'R' , chr ( 197 ) . chr ( 151 ) => 'r' ,
chr ( 197 ) . chr ( 152 ) => 'R' , chr ( 197 ) . chr ( 153 ) => 'r' ,
chr ( 197 ) . chr ( 154 ) => 'S' , chr ( 197 ) . chr ( 155 ) => 's' ,
chr ( 197 ) . chr ( 156 ) => 'S' , chr ( 197 ) . chr ( 157 ) => 's' ,
chr ( 197 ) . chr ( 158 ) => 'S' , chr ( 197 ) . chr ( 159 ) => 's' ,
2005-03-28 20:38:29 -05:00
chr ( 197 ) . chr ( 160 ) => 'S' , chr ( 197 ) . chr ( 161 ) => 's' ,
2005-03-28 22:12:24 -05:00
chr ( 197 ) . chr ( 162 ) => 'T' , chr ( 197 ) . chr ( 163 ) => 't' ,
chr ( 197 ) . chr ( 164 ) => 'T' , chr ( 197 ) . chr ( 165 ) => 't' ,
chr ( 197 ) . chr ( 166 ) => 'T' , chr ( 197 ) . chr ( 167 ) => 't' ,
chr ( 197 ) . chr ( 168 ) => 'U' , chr ( 197 ) . chr ( 169 ) => 'u' ,
chr ( 197 ) . chr ( 170 ) => 'U' , chr ( 197 ) . chr ( 171 ) => 'u' ,
chr ( 197 ) . chr ( 172 ) => 'U' , chr ( 197 ) . chr ( 173 ) => 'u' ,
chr ( 197 ) . chr ( 174 ) => 'U' , chr ( 197 ) . chr ( 175 ) => 'u' ,
chr ( 197 ) . chr ( 176 ) => 'U' , chr ( 197 ) . chr ( 177 ) => 'u' ,
chr ( 197 ) . chr ( 178 ) => 'U' , chr ( 197 ) . chr ( 179 ) => 'u' ,
chr ( 197 ) . chr ( 180 ) => 'W' , chr ( 197 ) . chr ( 181 ) => 'w' ,
chr ( 197 ) . chr ( 182 ) => 'Y' , chr ( 197 ) . chr ( 183 ) => 'y' ,
chr ( 197 ) . chr ( 184 ) => 'Y' , chr ( 197 ) . chr ( 185 ) => 'Z' ,
chr ( 197 ) . chr ( 186 ) => 'z' , chr ( 197 ) . chr ( 187 ) => 'Z' ,
chr ( 197 ) . chr ( 188 ) => 'z' , chr ( 197 ) . chr ( 189 ) => 'Z' ,
chr ( 197 ) . chr ( 190 ) => 'z' , chr ( 197 ) . chr ( 191 ) => 's' ,
2005-03-28 20:38:29 -05:00
// Euro Sign
chr ( 226 ) . chr ( 130 ) . chr ( 172 ) => 'E' );
2006-02-12 02:53:23 -05:00
2004-09-10 04:36:54 -04:00
$string = strtr ( $string , $chars );
} else {
// Assume ISO-8859-1 if not UTF-8
$chars [ 'in' ] = chr ( 128 ) . chr ( 131 ) . chr ( 138 ) . chr ( 142 ) . chr ( 154 ) . chr ( 158 )
. chr ( 159 ) . chr ( 162 ) . chr ( 165 ) . chr ( 181 ) . chr ( 192 ) . chr ( 193 ) . chr ( 194 )
. chr ( 195 ) . chr ( 196 ) . chr ( 197 ) . chr ( 199 ) . chr ( 200 ) . chr ( 201 ) . chr ( 202 )
. chr ( 203 ) . chr ( 204 ) . chr ( 205 ) . chr ( 206 ) . chr ( 207 ) . chr ( 209 ) . chr ( 210 )
. chr ( 211 ) . chr ( 212 ) . chr ( 213 ) . chr ( 214 ) . chr ( 216 ) . chr ( 217 ) . chr ( 218 )
. chr ( 219 ) . chr ( 220 ) . chr ( 221 ) . chr ( 224 ) . chr ( 225 ) . chr ( 226 ) . chr ( 227 )
. chr ( 228 ) . chr ( 229 ) . chr ( 231 ) . chr ( 232 ) . chr ( 233 ) . chr ( 234 ) . chr ( 235 )
. chr ( 236 ) . chr ( 237 ) . chr ( 238 ) . chr ( 239 ) . chr ( 241 ) . chr ( 242 ) . chr ( 243 )
. chr ( 244 ) . chr ( 245 ) . chr ( 246 ) . chr ( 248 ) . chr ( 249 ) . chr ( 250 ) . chr ( 251 )
. chr ( 252 ) . chr ( 253 ) . chr ( 255 );
$chars [ 'out' ] = " EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy " ;
$string = strtr ( $string , $chars [ 'in' ], $chars [ 'out' ]);
$double_chars [ 'in' ] = array ( chr ( 140 ), chr ( 156 ), chr ( 198 ), chr ( 208 ), chr ( 222 ), chr ( 223 ), chr ( 230 ), chr ( 240 ), chr ( 254 ));
$double_chars [ 'out' ] = array ( 'OE' , 'oe' , 'AE' , 'DH' , 'TH' , 'ss' , 'ae' , 'dh' , 'th' );
$string = str_replace ( $double_chars [ 'in' ], $double_chars [ 'out' ], $string );
2004-05-22 10:34:09 -04:00
}
2004-09-10 04:36:54 -04:00
2004-05-22 10:34:09 -04:00
return $string ;
}
2006-01-24 22:09:16 -05:00
function sanitize_user ( $username , $strict = false ) {
2006-01-18 00:37:26 -05:00
$raw_username = $username ;
$username = strip_tags ( $username );
// Kill octets
$username = preg_replace ( '|%([a-fA-F0-9][a-fA-F0-9])|' , '' , $username );
$username = preg_replace ( '/&.+?;/' , '' , $username ); // Kill entities
2006-01-24 22:09:16 -05:00
// If strict, reduce to ASCII for max portability.
if ( $strict )
2006-05-26 13:27:51 -04:00
$username = preg_replace ( '|[^a-z0-9 _.\-@]|i' , '' , $username );
2006-01-24 22:09:16 -05:00
return apply_filters ( 'sanitize_user' , $username , $raw_username , $strict );
2005-06-12 19:14:52 -04:00
}
2004-07-23 23:22:49 -04:00
function sanitize_title ( $title , $fallback_title = '' ) {
2005-01-02 04:08:55 -05:00
$title = strip_tags ( $title );
$title = apply_filters ( 'sanitize_title' , $title );
2004-08-05 21:28:51 -04:00
2005-01-02 04:08:55 -05:00
if ( empty ( $title )) {
$title = $fallback_title ;
}
2004-05-21 04:37:55 -04:00
2005-01-02 04:08:55 -05:00
return $title ;
2004-02-09 01:57:02 -05:00
}
2004-05-21 04:37:55 -04:00
function sanitize_title_with_dashes ( $title ) {
2004-09-15 21:08:50 -04:00
$title = strip_tags ( $title );
2005-02-01 03:31:13 -05:00
// Preserve escaped octets.
$title = preg_replace ( '|%([a-fA-F0-9][a-fA-F0-9])|' , '---$1---' , $title );
// Remove percent signs that are not part of an octet.
$title = str_replace ( '%' , '' , $title );
// Restore octets.
$title = preg_replace ( '|---([a-fA-F0-9][a-fA-F0-9])---|' , '%$1' , $title );
2005-01-02 04:08:55 -05:00
$title = remove_accents ( $title );
if ( seems_utf8 ( $title )) {
if ( function_exists ( 'mb_strtolower' )) {
$title = mb_strtolower ( $title , 'UTF-8' );
2004-09-10 04:36:54 -04:00
}
2005-01-02 04:08:55 -05:00
$title = utf8_uri_encode ( $title );
}
2004-09-10 04:36:54 -04:00
2005-01-02 04:08:55 -05:00
$title = strtolower ( $title );
$title = preg_replace ( '/&.+?;/' , '' , $title ); // kill entities
$title = preg_replace ( '/[^%a-z0-9 _-]/' , '' , $title );
$title = preg_replace ( '/\s+/' , '-' , $title );
$title = preg_replace ( '|-+|' , '-' , $title );
$title = trim ( $title , '-' );
2004-05-16 18:14:14 -04:00
2005-01-02 04:08:55 -05:00
return $title ;
2004-05-16 18:07:26 -04:00
}
2004-04-22 03:41:57 -04:00
function convert_chars ( $content , $flag = 'obsolete' ) {
2004-12-22 19:08:43 -05:00
// Translation of invalid Unicode references range to valid range
$wp_htmltranswinuni = array (
'€' => '€' , // the Euro sign
'' => '' ,
'‚' => '‚' , // these are Windows CP1252 specific characters
'ƒ' => 'ƒ' , // they would look weird on non-Windows browsers
'„' => '„' ,
'…' => '…' ,
'†' => '†' ,
'‡' => '‡' ,
'ˆ' => 'ˆ' ,
'‰' => '‰' ,
'Š' => 'Š' ,
'‹' => '‹' ,
'Œ' => 'Œ' ,
'' => '' ,
'Ž' => 'ž' ,
'' => '' ,
'' => '' ,
'‘' => '‘' ,
'’' => '’' ,
'“' => '“' ,
'”' => '”' ,
'•' => '•' ,
'–' => '–' ,
'—' => '—' ,
'˜' => '˜' ,
'™' => '™' ,
'š' => 'š' ,
'›' => '›' ,
'œ' => 'œ' ,
'' => '' ,
'ž' => '' ,
'Ÿ' => 'Ÿ'
);
2004-02-09 01:57:02 -05:00
2004-04-22 03:41:57 -04:00
// Remove metadata tags
2004-02-09 01:57:02 -05:00
$content = preg_replace ( '/<title>(.+?)<\/title>/' , '' , $content );
$content = preg_replace ( '/<category>(.+?)<\/category>/' , '' , $content );
2004-04-22 03:41:57 -04:00
// Converts lone & characters into & (a.k.a. &)
2005-11-12 21:48:35 -05:00
$content = preg_replace ( '/&([^#])(?![a-z1-4]{1,8};)/i' , '&$1' , $content );
2004-04-22 03:41:57 -04:00
// Fix Word pasting
2004-04-21 20:44:14 -04:00
$content = strtr ( $content , $wp_htmltranswinuni );
2004-02-09 01:57:02 -05:00
2004-04-22 03:41:57 -04:00
// Just a little XHTML help
$content = str_replace ( '<br>' , '<br />' , $content );
$content = str_replace ( '<hr>' , '<hr />' , $content );
2004-02-09 01:57:02 -05:00
return $content ;
}
2004-12-22 19:08:43 -05:00
function funky_javascript_fix ( $text ) {
// Fixes for browsers' javascript bugs
2004-12-30 12:34:27 -05:00
global $is_macIE , $is_winIE ;
2006-02-12 02:53:23 -05:00
2004-12-30 12:34:27 -05:00
if ( $is_winIE || $is_macIE )
2004-12-22 19:08:43 -05:00
$text = preg_replace ( " / \ %u([0-9A-F] { 4,4})/e " , " '&#'.base_convert(' \\ 1',16,10).';' " , $text );
2006-02-12 02:53:23 -05:00
2004-12-22 19:08:43 -05:00
return $text ;
}
2004-02-09 01:57:02 -05:00
/*
balanceTags
Balances Tags of string using a modified stack .
@ param text Text to be balanced
@ return Returns balanced text
@ author Leonard Lin ( leonard @ acm . org )
@ version v1 . 1
@ date November 4 , 2001
@ license GPL v2 . 0
@ notes
@ changelog
2005-01-06 05:24:11 -05:00
--- Modified by Scott Reilly ( coffee2code ) 02 Aug 2004
2004-02-09 01:57:02 -05:00
1.2 *** TODO *** Make better - change loop condition to $text
1.1 Fixed handling of append / stack pop order of end text
Added Cleaning Hooks
1.0 First Version
*/
2006-04-25 04:46:19 -04:00
function balanceTags ( $text , $is_comment = 0 , $force = false ) {
2006-02-12 02:53:23 -05:00
2006-04-25 04:46:19 -04:00
if ( ! $force && get_option ( 'use_balanceTags' ) == 0 )
2004-02-09 01:57:02 -05:00
return $text ;
$tagstack = array (); $stacksize = 0 ; $tagqueue = '' ; $newtext = '' ;
# WP bug fix for comments - in case you REALLY meant to type '< !--'
$text = str_replace ( '< !--' , '< !--' , $text );
# WP bug fix for LOVE <3 (and other situations with '<' before a number)
$text = preg_replace ( '#<([0-9]{1})#' , '<$1' , $text );
while ( preg_match ( " /<( \ /? \ w*) \ s*([^>]*)>/ " , $text , $regex )) {
2005-01-06 05:24:11 -05:00
$newtext .= $tagqueue ;
2004-02-09 01:57:02 -05:00
$i = strpos ( $text , $regex [ 0 ]);
2005-01-06 05:24:11 -05:00
$l = strlen ( $regex [ 0 ]);
2004-02-09 01:57:02 -05:00
// clear the shifter
$tagqueue = '' ;
// Pop or Push
if ( $regex [ 1 ][ 0 ] == " / " ) { // End Tag
$tag = strtolower ( substr ( $regex [ 1 ], 1 ));
// if too many closing tags
if ( $stacksize <= 0 ) {
$tag = '' ;
//or close to be safe $tag = '/' . $tag;
}
// if stacktop value = tag close value then pop
else if ( $tagstack [ $stacksize - 1 ] == $tag ) { // found closing tag
$tag = '</' . $tag . '>' ; // Close Tag
// Pop
array_pop ( $tagstack );
$stacksize -- ;
} else { // closing tag not at top, search for it
for ( $j = $stacksize - 1 ; $j >= 0 ; $j -- ) {
if ( $tagstack [ $j ] == $tag ) {
// add tag to tagqueue
for ( $k = $stacksize - 1 ; $k >= $j ; $k -- ){
$tagqueue .= '</' . array_pop ( $tagstack ) . '>' ;
$stacksize -- ;
}
break ;
}
}
$tag = '' ;
}
} else { // Begin Tag
$tag = strtolower ( $regex [ 1 ]);
// Tag Cleaning
2005-01-06 05:24:11 -05:00
// If self-closing or '', don't do anything.
if (( substr ( $regex [ 2 ], - 1 ) == '/' ) || ( $tag == '' )) {
}
// ElseIf it's a known single-entity tag but it doesn't close itself, do so
elseif ( $tag == 'br' || $tag == 'img' || $tag == 'hr' || $tag == 'input' ) {
$regex [ 2 ] .= '/' ;
} else { // Push the tag onto the stack
// If the top of the stack is the same as the tag we want to push, close previous tag
if (( $stacksize > 0 ) && ( $tag != 'div' ) && ( $tagstack [ $stacksize - 1 ] == $tag )) {
$tagqueue = '</' . array_pop ( $tagstack ) . '>' ;
$stacksize -- ;
}
2004-02-09 01:57:02 -05:00
$stacksize = array_push ( $tagstack , $tag );
}
// Attributes
$attributes = $regex [ 2 ];
if ( $attributes ) {
$attributes = ' ' . $attributes ;
}
$tag = '<' . $tag . $attributes . '>' ;
2005-01-06 05:24:11 -05:00
//If already queuing a close tag, then put this tag on, too
if ( $tagqueue ) {
$tagqueue .= $tag ;
$tag = '' ;
}
2004-02-09 01:57:02 -05:00
}
$newtext .= substr ( $text , 0 , $i ) . $tag ;
$text = substr ( $text , $i + $l );
}
// Clear Tag Queue
2005-01-06 05:24:11 -05:00
$newtext .= $tagqueue ;
2004-02-09 01:57:02 -05:00
// Add Remaining text
$newtext .= $text ;
// Empty Stack
while ( $x = array_pop ( $tagstack )) {
2005-01-06 05:24:11 -05:00
$newtext .= '</' . $x . '>' ; // Add remaining tags to close
2004-02-09 01:57:02 -05:00
}
2004-04-22 03:41:57 -04:00
// WP fix for the bug with HTML comments
2004-02-09 01:57:02 -05:00
$newtext = str_replace ( " < !-- " , " <!-- " , $newtext );
$newtext = str_replace ( " < !-- " , " < !-- " , $newtext );
return $newtext ;
}
2006-07-04 18:09:44 -04:00
function force_balance_tags ( $text ) {
return balanceTags ( $text , 0 , true );
}
2004-02-09 01:57:02 -05:00
2005-12-06 19:36:07 -05:00
function format_to_edit ( $content , $richedit = false ) {
2004-04-04 19:15:54 -04:00
$content = apply_filters ( 'format_to_edit' , $content );
2005-12-06 19:36:07 -05:00
if ( ! $richedit )
$content = htmlspecialchars ( $content );
2004-02-09 01:57:02 -05:00
return $content ;
}
2004-03-28 22:54:57 -05:00
2004-02-09 01:57:02 -05:00
function format_to_post ( $content ) {
2004-03-28 22:54:57 -05:00
global $wpdb ;
2004-04-04 19:15:54 -04:00
$content = apply_filters ( 'format_to_post' , $content );
2004-02-09 01:57:02 -05:00
return $content ;
}
function zeroise ( $number , $threshold ) { // function to add leading zeros when necessary
2004-12-30 12:34:27 -05:00
return sprintf ( '%0' . $threshold . 's' , $number );
2006-06-07 23:17:01 -04:00
}
2004-02-09 01:57:02 -05:00
function backslashit ( $string ) {
2006-06-07 23:17:01 -04:00
$string = preg_replace ( '/^([0-9])/' , '\\\\\\\\\1' , $string );
2004-02-09 01:57:02 -05:00
$string = preg_replace ( '/([a-z])/i' , '\\\\\1' , $string );
return $string ;
}
function trailingslashit ( $string ) {
if ( '/' != substr ( $string , - 1 )) {
$string .= '/' ;
}
return $string ;
}
function addslashes_gpc ( $gpc ) {
2005-07-05 16:47:22 -04:00
global $wpdb ;
if ( get_magic_quotes_gpc ()) {
$gpc = stripslashes ( $gpc );
2004-02-09 01:57:02 -05:00
}
2005-07-05 16:47:22 -04:00
return $wpdb -> escape ( $gpc );
2004-02-09 01:57:02 -05:00
}
2005-07-05 21:12:38 -04:00
function stripslashes_deep ( $value )
{
$value = is_array ( $value ) ?
array_map ( 'stripslashes_deep' , $value ) :
stripslashes ( $value );
return $value ;
}
2004-02-09 01:57:02 -05:00
function antispambot ( $emailaddy , $mailto = 0 ) {
$emailNOSPAMaddy = '' ;
srand (( float ) microtime () * 1000000 );
for ( $i = 0 ; $i < strlen ( $emailaddy ); $i = $i + 1 ) {
$j = floor ( rand ( 0 , 1 + $mailto ));
if ( $j == 0 ) {
$emailNOSPAMaddy .= '&#' . ord ( substr ( $emailaddy , $i , 1 )) . ';' ;
} elseif ( $j == 1 ) {
$emailNOSPAMaddy .= substr ( $emailaddy , $i , 1 );
} elseif ( $j == 2 ) {
$emailNOSPAMaddy .= '%' . zeroise ( dechex ( ord ( substr ( $emailaddy , $i , 1 ))), 2 );
}
}
$emailNOSPAMaddy = str_replace ( '@' , '@' , $emailNOSPAMaddy );
return $emailNOSPAMaddy ;
}
2004-12-28 15:28:57 -05:00
function make_clickable ( $ret ) {
2006-07-10 23:30:12 -04:00
$ret = ' ' . $ret ;
$ret = preg_replace ( " #(^|[ \n ])([ \ w]+?://[ \ w \ # $ %&~/. \ -;:=,?@ \ [ \ ]+]*)#is " , " $ 1<a href=' $ 2' rel='nofollow'> $ 2</a> " , $ret );
$ret = preg_replace ( " #(^|[ \n ])((www|ftp) \ .[ \ w \ # $ %&~/. \ -;:=,?@ \ [ \ ]+]*)#is " , " $ 1<a href='http:// $ 2' rel='nofollow'> $ 2</a> " , $ret );
$ret = preg_replace ( " #( \ s)([a-z0-9 \ -_.]+)@([^,< \n \r ]+)#i " , " $ 1<a href= \" mailto: $ 2@ $ 3 \" > $ 2@ $ 3</a> " , $ret );
$ret = substr ( $ret , 1 );
2004-08-28 04:40:13 -04:00
$ret = trim ( $ret );
return $ret ;
2004-02-09 01:57:02 -05:00
}
2005-01-21 13:24:14 -05:00
function wp_rel_nofollow ( $text ) {
2006-02-28 04:49:06 -05:00
global $wpdb ;
// This is a pre save filter, so text is already escaped.
$text = stripslashes ( $text );
2006-08-30 12:50:12 -04:00
$text = preg_replace ( '|<a (.+?)>|ie' , " '<a ' . str_replace(' rel= \" nofollow \" ','',stripslashes(' $ 1')) . ' rel= \" nofollow \" >' " , $text );
2006-02-28 04:49:06 -05:00
$text = $wpdb -> escape ( $text );
2005-01-21 13:24:14 -05:00
return $text ;
}
2004-02-09 01:57:02 -05:00
function convert_smilies ( $text ) {
global $wp_smiliessearch , $wp_smiliesreplace ;
$output = '' ;
2006-08-30 17:46:31 -04:00
if ( get_option ( 'use_smilies' )) {
2004-02-09 01:57:02 -05:00
// HTML loop taken from texturize function, could possible be consolidated
$textarr = preg_split ( " /(<.*>)/U " , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE ); // capture the tags as well as in between
$stop = count ( $textarr ); // loop stuff
for ( $i = 0 ; $i < $stop ; $i ++ ) {
$content = $textarr [ $i ];
if (( strlen ( $content ) > 0 ) && ( '<' != $content { 0 })) { // If it's not a tag
$content = str_replace ( $wp_smiliessearch , $wp_smiliesreplace , $content );
}
$output .= $content ;
}
} else {
// return default text.
$output = $text ;
}
return $output ;
}
function is_email ( $user_email ) {
2004-05-14 01:52:53 -04:00
$chars = " /^([a-z0-9+_]| \\ -| \\ .)+@(([a-z0-9_]| \\ -)+ \\ .)+[a-z] { 2,6} \$ /i " ;
2004-02-09 01:57:02 -05:00
if ( strstr ( $user_email , '@' ) && strstr ( $user_email , '.' )) {
if ( preg_match ( $chars , $user_email )) {
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
2004-02-21 19:31:25 -05:00
// used by wp-mail to handle charsets in email subjects
function wp_iso_descrambler ( $string ) {
/* this may only work with iso-8859-1, I'm afraid */
if ( ! preg_match ( '#\=\?(.+)\?Q\?(.+)\?\=#i' , $string , $matches )) {
return $string ;
} else {
$subject = str_replace ( '_' , ' ' , $matches [ 2 ]);
$subject = preg_replace ( '#\=([0-9a-f]{2})#ei' , " chr(hexdec(strtolower(' $ 1'))) " , $subject );
return $subject ;
}
}
2004-02-22 22:04:55 -05:00
// give it a date, it will give you the same date as GMT
function get_gmt_from_date ( $string ) {
2004-02-23 11:09:27 -05:00
// note: this only substracts $time_difference from the given date
preg_match ( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#' , $string , $matches );
$string_time = gmmktime ( $matches [ 4 ], $matches [ 5 ], $matches [ 6 ], $matches [ 2 ], $matches [ 3 ], $matches [ 1 ]);
2006-08-30 17:46:31 -04:00
$string_gmt = gmdate ( 'Y-m-d H:i:s' , $string_time - get_option ( 'gmt_offset' ) * 3600 );
2004-02-23 11:09:27 -05:00
return $string_gmt ;
2004-02-22 22:04:55 -05:00
}
2004-02-22 23:37:11 -05:00
// give it a GMT date, it will give you the same date with $time_difference added
function get_date_from_gmt ( $string ) {
2004-02-23 11:09:27 -05:00
// note: this only adds $time_difference to the given date
preg_match ( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#' , $string , $matches );
$string_time = gmmktime ( $matches [ 4 ], $matches [ 5 ], $matches [ 6 ], $matches [ 2 ], $matches [ 3 ], $matches [ 1 ]);
2006-08-30 17:46:31 -04:00
$string_localtime = gmdate ( 'Y-m-d H:i:s' , $string_time + get_option ( 'gmt_offset' ) * 3600 );
2004-02-23 11:09:27 -05:00
return $string_localtime ;
2004-02-22 23:37:11 -05:00
}
2004-05-31 13:02:09 -04:00
// computes an offset in seconds from an iso8601 timezone
function iso8601_timezone_to_offset ( $timezone ) {
// $timezone is either 'Z' or '[+|-]hhmm'
if ( $timezone == 'Z' ) {
$offset = 0 ;
} else {
$sign = ( substr ( $timezone , 0 , 1 ) == '+' ) ? 1 : - 1 ;
$hours = intval ( substr ( $timezone , 1 , 2 ));
$minutes = intval ( substr ( $timezone , 3 , 4 )) / 60 ;
$offset = $sign * 3600 * ( $hours + $minutes );
}
return $offset ;
}
// converts an iso8601 date to MySQL DateTime format used by post_date[_gmt]
function iso8601_to_datetime ( $date_string , $timezone = USER ) {
if ( $timezone == GMT ) {
preg_match ( '#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#' , $date_string , $date_bits );
if ( ! empty ( $date_bits [ 7 ])) { // we have a timezone, so let's compute an offset
$offset = iso8601_timezone_to_offset ( $date_bits [ 7 ]);
} else { // we don't have a timezone, so we assume user local timezone (not server's!)
2006-08-30 17:46:31 -04:00
$offset = 3600 * get_option ( 'gmt_offset' );
2004-05-31 13:02:09 -04:00
}
$timestamp = gmmktime ( $date_bits [ 4 ], $date_bits [ 5 ], $date_bits [ 6 ], $date_bits [ 2 ], $date_bits [ 3 ], $date_bits [ 1 ]);
$timestamp -= $offset ;
return gmdate ( 'Y-m-d H:i:s' , $timestamp );
} elseif ( $timezone == USER ) {
return preg_replace ( '#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#' , '$1-$2-$3 $4:$5:$6' , $date_string );
}
}
2004-06-10 06:01:45 -04:00
function popuplinks ( $text ) {
// Comment text in popup windows should be filtered through this.
// Right now it's a moderately dumb function, ideally it would detect whether
// a target or rel attribute was already there and adjust its actions accordingly.
$text = preg_replace ( '/<a (.+?)>/i' , " <a $ 1 target='_blank' rel='external'> " , $text );
return $text ;
}
2004-12-15 21:57:05 -05:00
function sanitize_email ( $email ) {
return preg_replace ( '/[^a-z0-9+_.@-]/i' , '' , $email );
}
2004-12-18 19:10:10 -05:00
function human_time_diff ( $from , $to = '' ) {
if ( empty ( $to ) )
$to = time ();
2005-03-10 03:01:02 -05:00
$diff = ( int ) abs ( $to - $from );
2004-12-18 19:10:10 -05:00
if ( $diff <= 3600 ) {
$mins = round ( $diff / 60 );
2005-01-24 01:01:04 -05:00
if ( $mins <= 1 )
$since = __ ( '1 min' );
else
$since = sprintf ( __ ( '%s mins' ), $mins );
2004-12-18 19:10:10 -05:00
} else if (( $diff <= 86400 ) && ( $diff > 3600 )) {
$hours = round ( $diff / 3600 );
if ( $hours <= 1 )
$since = __ ( '1 hour' );
else
$since = sprintf ( __ ( '%s hours' ), $hours );
} elseif ( $diff >= 86400 ) {
$days = round ( $diff / 86400 );
if ( $days <= 1 )
$since = __ ( '1 day' );
else
$since = sprintf ( __ ( '%s days' ), $days );
}
return $since ;
}
2005-03-13 20:02:04 -05:00
function wp_trim_excerpt ( $text ) { // Fakes an excerpt if needed
2005-02-14 19:21:21 -05:00
global $post ;
if ( '' == $text ) {
2006-09-11 19:59:00 -04:00
$text = get_the_content ( '' );
2005-03-13 20:02:04 -05:00
$text = apply_filters ( 'the_content' , $text );
$text = str_replace ( ']]>' , ']]>' , $text );
$text = strip_tags ( $text );
2005-02-14 19:21:21 -05:00
$excerpt_length = 55 ;
2005-03-13 20:02:04 -05:00
$words = explode ( ' ' , $text , $excerpt_length + 1 );
if ( count ( $words ) > $excerpt_length ) {
array_pop ( $words );
array_push ( $words , '[...]' );
$text = implode ( ' ' , $words );
2005-02-14 19:21:21 -05:00
}
2005-03-13 20:02:04 -05:00
}
2005-02-14 19:21:21 -05:00
return $text ;
}
2005-04-05 13:25:57 -04:00
function ent2ncr ( $text ) {
$to_ncr = array (
2005-07-02 19:44:35 -04:00
'"' => '"' ,
'&' => '&' ,
'⁄' => '/' ,
'<' => '<' ,
'>' => '>' ,
'|' => '|' ,
' ' => ' ' ,
'¡' => '¡' ,
'¢' => '¢' ,
'£' => '£' ,
'¤' => '¤' ,
'¥' => '¥' ,
'¦' => '¦' ,
'&brkbar;' => '¦' ,
'§' => '§' ,
'¨' => '¨' ,
'¨' => '¨' ,
'©' => '©' ,
'ª' => 'ª' ,
'«' => '«' ,
'¬' => '¬' ,
'­' => '­' ,
'®' => '®' ,
'¯' => '¯' ,
'&hibar;' => '¯' ,
'°' => '°' ,
'±' => '±' ,
'²' => '²' ,
'³' => '³' ,
'´' => '´' ,
'µ' => 'µ' ,
'¶' => '¶' ,
'·' => '·' ,
'¸' => '¸' ,
'¹' => '¹' ,
'º' => 'º' ,
'»' => '»' ,
'¼' => '¼' ,
'½' => '½' ,
'¾' => '¾' ,
'¿' => '¿' ,
'À' => 'À' ,
'Á' => 'Á' ,
'Â' => 'Â' ,
'Ã' => 'Ã' ,
'Ä' => 'Ä' ,
'Å' => 'Å' ,
'Æ' => 'Æ' ,
'Ç' => 'Ç' ,
'È' => 'È' ,
'É' => 'É' ,
'Ê' => 'Ê' ,
'Ë' => 'Ë' ,
'Ì' => 'Ì' ,
'Í' => 'Í' ,
'Î' => 'Î' ,
'Ï' => 'Ï' ,
'Ð' => 'Ð' ,
'Ñ' => 'Ñ' ,
'Ò' => 'Ò' ,
'Ó' => 'Ó' ,
'Ô' => 'Ô' ,
'Õ' => 'Õ' ,
'Ö' => 'Ö' ,
'×' => '×' ,
'Ø' => 'Ø' ,
'Ù' => 'Ù' ,
'Ú' => 'Ú' ,
'Û' => 'Û' ,
'Ü' => 'Ü' ,
'Ý' => 'Ý' ,
'Þ' => 'Þ' ,
'ß' => 'ß' ,
'à' => 'à' ,
'á' => 'á' ,
'â' => 'â' ,
'ã' => 'ã' ,
'ä' => 'ä' ,
'å' => 'å' ,
'æ' => 'æ' ,
'ç' => 'ç' ,
'è' => 'è' ,
'é' => 'é' ,
'ê' => 'ê' ,
'ë' => 'ë' ,
'ì' => 'ì' ,
'í' => 'í' ,
'î' => 'î' ,
'ï' => 'ï' ,
'ð' => 'ð' ,
'ñ' => 'ñ' ,
'ò' => 'ò' ,
'ó' => 'ó' ,
'ô' => 'ô' ,
'õ' => 'õ' ,
'ö' => 'ö' ,
'÷' => '÷' ,
'ø' => 'ø' ,
'ù' => 'ù' ,
'ú' => 'ú' ,
'û' => 'û' ,
'ü' => 'ü' ,
'ý' => 'ý' ,
'þ' => 'þ' ,
'ÿ' => 'ÿ' ,
'Œ' => 'Œ' ,
'œ' => 'œ' ,
'Š' => 'Š' ,
'š' => 'š' ,
'Ÿ' => 'Ÿ' ,
'ƒ' => 'ƒ' ,
'ˆ' => 'ˆ' ,
'˜' => '˜' ,
'Α' => 'Α' ,
'Β' => 'Β' ,
'Γ' => 'Γ' ,
'Δ' => 'Δ' ,
'Ε' => 'Ε' ,
'Ζ' => 'Ζ' ,
'Η' => 'Η' ,
'Θ' => 'Θ' ,
'Ι' => 'Ι' ,
'Κ' => 'Κ' ,
'Λ' => 'Λ' ,
'Μ' => 'Μ' ,
'Ν' => 'Ν' ,
'Ξ' => 'Ξ' ,
'Ο' => 'Ο' ,
'Π' => 'Π' ,
'Ρ' => 'Ρ' ,
'Σ' => 'Σ' ,
'Τ' => 'Τ' ,
'Υ' => 'Υ' ,
'Φ' => 'Φ' ,
'Χ' => 'Χ' ,
'Ψ' => 'Ψ' ,
'Ω' => 'Ω' ,
'α' => 'α' ,
'β' => 'β' ,
'γ' => 'γ' ,
'δ' => 'δ' ,
'ε' => 'ε' ,
'ζ' => 'ζ' ,
'η' => 'η' ,
'θ' => 'θ' ,
'ι' => 'ι' ,
'κ' => 'κ' ,
'λ' => 'λ' ,
'μ' => 'μ' ,
'ν' => 'ν' ,
'ξ' => 'ξ' ,
'ο' => 'ο' ,
'π' => 'π' ,
'ρ' => 'ρ' ,
'ς' => 'ς' ,
'σ' => 'σ' ,
'τ' => 'τ' ,
'υ' => 'υ' ,
'φ' => 'φ' ,
'χ' => 'χ' ,
'ψ' => 'ψ' ,
'ω' => 'ω' ,
'ϑ' => 'ϑ' ,
'ϒ' => 'ϒ' ,
'ϖ' => 'ϖ' ,
' ' => ' ' ,
' ' => ' ' ,
' ' => ' ' ,
'‌' => '‌' ,
'‍' => '‍' ,
'‎' => '‎' ,
'‏' => '‏' ,
'–' => '–' ,
'—' => '—' ,
'‘' => '‘' ,
'’' => '’' ,
'‚' => '‚' ,
'“' => '“' ,
'”' => '”' ,
'„' => '„' ,
'†' => '†' ,
'‡' => '‡' ,
'•' => '•' ,
'…' => '…' ,
'‰' => '‰' ,
'′' => '′' ,
'″' => '″' ,
'‹' => '‹' ,
'›' => '›' ,
'‾' => '‾' ,
'⁄' => '⁄' ,
'€' => '€' ,
'ℑ' => 'ℑ' ,
'℘' => '℘' ,
'ℜ' => 'ℜ' ,
'™' => '™' ,
'ℵ' => 'ℵ' ,
'↵' => '↵' ,
'⇐' => '⇐' ,
'⇑' => '⇑' ,
'⇒' => '⇒' ,
'⇓' => '⇓' ,
'⇔' => '⇔' ,
'∀' => '∀' ,
'∂' => '∂' ,
'∃' => '∃' ,
'∅' => '∅' ,
'∇' => '∇' ,
'∈' => '∈' ,
'∉' => '∉' ,
'∋' => '∋' ,
'∏' => '∏' ,
'∑' => '∑' ,
'−' => '−' ,
'∗' => '∗' ,
'√' => '√' ,
'∝' => '∝' ,
'∞' => '∞' ,
'∠' => '∠' ,
'∧' => '∧' ,
'∨' => '∨' ,
'∩' => '∩' ,
'∪' => '∪' ,
'∫' => '∫' ,
'∴' => '∴' ,
'∼' => '∼' ,
'≅' => '≅' ,
'≈' => '≈' ,
'≠' => '≠' ,
'≡' => '≡' ,
'≤' => '≤' ,
'≥' => '≥' ,
'⊂' => '⊂' ,
'⊃' => '⊃' ,
'⊄' => '⊄' ,
'⊆' => '⊆' ,
'⊇' => '⊇' ,
'⊕' => '⊕' ,
'⊗' => '⊗' ,
'⊥' => '⊥' ,
'⋅' => '⋅' ,
'⌈' => '⌈' ,
'⌉' => '⌉' ,
'⌊' => '⌊' ,
'⌋' => '⌋' ,
'⟨' => '〈' ,
'⟩' => '〉' ,
'←' => '←' ,
'↑' => '↑' ,
'→' => '→' ,
'↓' => '↓' ,
'↔' => '↔' ,
'◊' => '◊' ,
'♠' => '♠' ,
'♣' => '♣' ,
'♥' => '♥' ,
'♦' => '♦'
2005-04-05 13:25:57 -04:00
);
2006-03-13 21:48:36 -05:00
return str_replace ( array_keys ( $to_ncr ), array_values ( $to_ncr ), $text );
2005-04-05 13:25:57 -04:00
}
2005-11-17 12:47:29 -05:00
function wp_richedit_pre ( $text ) {
// Filtering a blank results in an annoying <br />\n
2005-12-10 14:03:22 -05:00
if ( empty ( $text ) ) return apply_filters ( 'richedit_pre' , '' );
2005-11-17 12:47:29 -05:00
$output = $text ;
$output = convert_chars ( $output );
$output = wpautop ( $output );
// These must be double-escaped or planets will collide.
$output = str_replace ( '<' , '&lt;' , $output );
$output = str_replace ( '>' , '&gt;' , $output );
2005-12-10 14:03:22 -05:00
return apply_filters ( 'richedit_pre' , $output );
2005-11-17 12:47:29 -05:00
}
2006-04-18 00:58:38 -04:00
function clean_url ( $url ) {
if ( '' == $url ) return $url ;
2006-08-31 13:30:17 -04:00
$url = preg_replace ( '|[^a-z0-9-~+_.?#=&;,/:%]|i' , '' , $url );
$strip = array ( '%0d' , '%0a' );
$url = str_replace ( $strip , '' , $url );
2006-04-18 00:58:38 -04:00
$url = str_replace ( ';//' , '://' , $url );
$url = ( ! strstr ( $url , '://' )) ? 'http://' . $url : $url ;
$url = preg_replace ( '/&([^#])(?![a-z]{2,8};)/' , '&$1' , $url );
return $url ;
}
2006-04-18 23:03:27 -04:00
// Borrowed from the PHP Manual user notes. Convert entities, while
// preserving already-encoded entities:
function htmlentities2 ( $myHTML ) {
$translation_table = get_html_translation_table ( HTML_ENTITIES , ENT_QUOTES );
$translation_table [ chr ( 38 )] = '&' ;
return preg_replace ( " /&(?![A-Za-z] { 0,4} \ w { 2,3};|#[0-9] { 2,3};)/ " , " & " , strtr ( $myHTML , $translation_table ));
}
2006-05-05 03:49:05 -04:00
// Escape single quotes, specialchar double quotes, and fix line endings.
function js_escape ( $text ) {
$text = wp_specialchars ( $text , 'double' );
2006-06-23 21:28:08 -04:00
$text = str_replace ( ''' , " ' " , $text );
return preg_replace ( " / \r ? \n / " , " \\ n " , addslashes ( $text ));
2006-05-05 03:49:05 -04:00
}
2006-06-23 21:28:08 -04:00
2005-11-16 01:37:06 -05:00
?>