3 function wptexturize($text) {
5 // Capture tags and everything inside them
6 $textarr = preg_split("/(<.*>)/Us", $text, -1, PREG_SPLIT_DELIM_CAPTURE);
7 $stop = count($textarr); $next = true; // loop stuff
8 for ($i = 0; $i < $stop; $i++) {
11 if (isset($curl{0}) && '<' != $curl{0} && $next) { // If it's not a tag
12 $curl = str_replace('---', '—', $curl);
13 $curl = str_replace(' -- ', ' — ', $curl);
14 $curl = str_replace('--', '–', $curl);
15 $curl = str_replace('xn–', 'xn--', $curl);
16 $curl = str_replace('...', '…', $curl);
17 $curl = str_replace('``', '“', $curl);
19 // This is a hack, look at this more later. It works pretty well though.
20 $cockney = array("'tain't","'twere","'twas","'tis","'twill","'til","'bout","'nuff","'round","'cause");
21 $cockneyreplace = array("’tain’t","’twere","’twas","’tis","’twill","’til","’bout","’nuff","’round","’cause");
22 $curl = str_replace($cockney, $cockneyreplace, $curl);
24 $curl = preg_replace("/'s/", '’s', $curl);
25 $curl = preg_replace("/'(\d\d(?:’|')?s)/", "’$1", $curl);
26 $curl = preg_replace('/(\s|\A|")\'/', '$1‘', $curl);
27 $curl = preg_replace('/(\d+)"/', '$1″', $curl);
28 $curl = preg_replace("/(\d+)'/", '$1′', $curl);
29 $curl = preg_replace("/(\S)'([^'\s])/", "$1’$2", $curl);
30 $curl = preg_replace('/(\s|\A)"(?!\s)/', '$1“$2', $curl);
31 $curl = preg_replace('/"(\s|\S|\Z)/', '”$1', $curl);
32 $curl = preg_replace("/'([\s.]|\Z)/", '’$1', $curl);
33 $curl = preg_replace("/ \(tm\)/i", ' ™', $curl);
34 $curl = str_replace("''", '”', $curl);
36 $curl = preg_replace('/(\d+)x(\d+)/', "$1×$2", $curl);
38 } elseif (strstr($curl, '<code') || strstr($curl, '<pre') || strstr($curl, '<kbd' || strstr($curl, '<style') || strstr($curl, '<script'))) {
44 $curl = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/', '&$1', $curl);
50 function clean_pre($text) {
51 $text = str_replace('<br />', '', $text);
52 $text = str_replace('<p>', "\n", $text);
53 $text = str_replace('</p>', '', $text);
57 function wpautop($pee, $br = 1) {
58 $pee = $pee . "\n"; // just to make things a little easier, pad the end
59 $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
60 // Space things out a little
61 $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);
62 $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);
63 $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
64 $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
65 $pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end
66 $pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
67 $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
68 $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
69 $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
70 $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
71 $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);
72 $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);
73 if ($br) $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
74 $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);
75 $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $pee);
76 $pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' ", $pee);
82 function seems_utf8($Str) { # by bmorel at ssi dot fr
83 for ($i=0; $i<strlen($Str); $i++) {
84 if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
85 elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
86 elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
87 elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
88 elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
89 elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
90 else return false; # Does not match any model
91 for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
92 if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
99 function wp_specialchars( $text, $quotes = 0 ) {
100 // Like htmlspecialchars except don't double-encode HTML entities
101 $text = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/', '&$1', $text);-
102 $text = str_replace('<', '<', $text);
103 $text = str_replace('>', '>', $text);
105 $text = str_replace('"', '"', $text);
106 $text = str_replace("'", ''', $text);
111 function utf8_uri_encode( $utf8_string ) {
116 for ($i = 0; $i < strlen( $utf8_string ); $i++ ) {
118 $value = ord( $utf8_string[ $i ] );
120 if ( $value < 128 ) {
121 $unicode .= chr($value);
123 if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;
127 if ( count( $values ) == $num_octets ) {
128 if ($num_octets == 3) {
129 $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);
131 $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);
143 function remove_accents($string) {
144 if (seems_utf8($string)) {
146 // Decompositions for Latin-1 Supplement
147 chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
148 chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
149 chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
150 chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
151 chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
152 chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
153 chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
154 chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
155 chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
156 chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
157 chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
158 chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
159 chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
160 chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
161 chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
162 chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
163 chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
164 chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
165 chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
166 chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
167 chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
168 chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
169 chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
170 chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
171 chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
172 chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
173 chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
174 chr(195).chr(191) => 'y',
175 // Decompositions for Latin Extended-A
176 chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
177 chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
178 chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
179 chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
180 chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
181 chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
182 chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
183 chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
184 chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
185 chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
186 chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
187 chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
188 chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
189 chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
190 chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
191 chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
192 chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
193 chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
194 chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
195 chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
196 chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
197 chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
198 chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
199 chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
200 chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
201 chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
202 chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
203 chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
204 chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
205 chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
206 chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
207 chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
208 chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
209 chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
210 chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
211 chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
212 chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
213 chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
214 chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
215 chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
216 chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
217 chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
218 chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
219 chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
220 chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
221 chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
222 chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
223 chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
224 chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
225 chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
226 chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
227 chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
228 chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
229 chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
230 chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
231 chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
232 chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
233 chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
234 chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
235 chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
236 chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
237 chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
238 chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
239 chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
241 chr(226).chr(130).chr(172) => 'E');
243 $string = strtr($string, $chars);
245 // Assume ISO-8859-1 if not UTF-8
246 $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
247 .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
248 .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
249 .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
250 .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
251 .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
252 .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
253 .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
254 .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
255 .chr(252).chr(253).chr(255);
257 $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
259 $string = strtr($string, $chars['in'], $chars['out']);
260 $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
261 $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
262 $string = str_replace($double_chars['in'], $double_chars['out'], $string);
268 function sanitize_user( $username, $strict = false ) {
269 $raw_username = $username;
270 $username = strip_tags($username);
272 $username = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '', $username);
273 $username = preg_replace('/&.+?;/', '', $username); // Kill entities
275 // If strict, reduce to ASCII for max portability.
277 $username = preg_replace('|[^a-z0-9 _.-@]|i', '', $username);
279 return apply_filters('sanitize_user', $username, $raw_username, $strict);
282 function sanitize_title($title, $fallback_title = '') {
283 $title = strip_tags($title);
284 $title = apply_filters('sanitize_title', $title);
287 $title = $fallback_title;
293 function sanitize_title_with_dashes($title) {
294 $title = strip_tags($title);
295 // Preserve escaped octets.
296 $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
297 // Remove percent signs that are not part of an octet.
298 $title = str_replace('%', '', $title);
300 $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);
302 $title = remove_accents($title);
303 if (seems_utf8($title)) {
304 if (function_exists('mb_strtolower')) {
305 $title = mb_strtolower($title, 'UTF-8');
307 $title = utf8_uri_encode($title);
310 $title = strtolower($title);
311 $title = preg_replace('/&.+?;/', '', $title); // kill entities
312 $title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
313 $title = preg_replace('/\s+/', '-', $title);
314 $title = preg_replace('|-+|', '-', $title);
315 $title = trim($title, '-');
320 function convert_chars($content, $flag = 'obsolete') {
321 // Translation of invalid Unicode references range to valid range
322 $wp_htmltranswinuni = array(
323 '€' => '€', // the Euro sign
325 '‚' => '‚', // these are Windows CP1252 specific characters
326 'ƒ' => 'ƒ', // they would look weird on non-Windows browsers
327 '„' => '„',
328 '…' => '…',
329 '†' => '†',
330 '‡' => '‡',
331 'ˆ' => 'ˆ',
332 '‰' => '‰',
333 'Š' => 'Š',
334 '‹' => '‹',
335 'Œ' => 'Œ',
337 'Ž' => 'ž',
340 '‘' => '‘',
341 '’' => '’',
342 '“' => '“',
343 '”' => '”',
344 '•' => '•',
345 '–' => '–',
346 '—' => '—',
347 '˜' => '˜',
348 '™' => '™',
349 'š' => 'š',
350 '›' => '›',
351 'œ' => 'œ',
357 // Remove metadata tags
358 $content = preg_replace('/<title>(.+?)<\/title>/','',$content);
359 $content = preg_replace('/<category>(.+?)<\/category>/','',$content);
361 // Converts lone & characters into & (a.k.a. &)
362 $content = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/i', '&$1', $content);
365 $content = strtr($content, $wp_htmltranswinuni);
367 // Just a little XHTML help
368 $content = str_replace('<br>', '<br />', $content);
369 $content = str_replace('<hr>', '<hr />', $content);
374 function funky_javascript_fix($text) {
375 // Fixes for browsers' javascript bugs
376 global $is_macIE, $is_winIE;
378 if ( $is_winIE || $is_macIE )
379 $text = preg_replace("/\%u([0-9A-F]{4,4})/e", "'&#'.base_convert('\\1',16,10).';'", $text);
387 Balances Tags of string using a modified stack.
389 @param text Text to be balanced
390 @return Returns balanced text
391 @author Leonard Lin (leonard@acm.org)
393 @date November 4, 2001
397 --- Modified by Scott Reilly (coffee2code) 02 Aug 2004
398 1.2 ***TODO*** Make better - change loop condition to $text
399 1.1 Fixed handling of append/stack pop order of end text
403 function balanceTags($text, $is_comment = 0) {
405 if ( get_option('use_balanceTags') == 0)
408 $tagstack = array(); $stacksize = 0; $tagqueue = ''; $newtext = '';
410 # WP bug fix for comments - in case you REALLY meant to type '< !--'
411 $text = str_replace('< !--', '< !--', $text);
412 # WP bug fix for LOVE <3 (and other situations with '<' before a number)
413 $text = preg_replace('#<([0-9]{1})#', '<$1', $text);
415 while (preg_match("/<(\/?\w*)\s*([^>]*)>/",$text,$regex)) {
416 $newtext .= $tagqueue;
418 $i = strpos($text,$regex[0]);
419 $l = strlen($regex[0]);
424 if ($regex[1][0] == "/") { // End Tag
425 $tag = strtolower(substr($regex[1],1));
426 // if too many closing tags
427 if($stacksize <= 0) {
429 //or close to be safe $tag = '/' . $tag;
431 // if stacktop value = tag close value then pop
432 else if ($tagstack[$stacksize - 1] == $tag) { // found closing tag
433 $tag = '</' . $tag . '>'; // Close Tag
435 array_pop ($tagstack);
437 } else { // closing tag not at top, search for it
438 for ($j=$stacksize-1;$j>=0;$j--) {
439 if ($tagstack[$j] == $tag) {
440 // add tag to tagqueue
441 for ($k=$stacksize-1;$k>=$j;$k--){
442 $tagqueue .= '</' . array_pop ($tagstack) . '>';
450 } else { // Begin Tag
451 $tag = strtolower($regex[1]);
455 // If self-closing or '', don't do anything.
456 if((substr($regex[2],-1) == '/') || ($tag == '')) {
458 // ElseIf it's a known single-entity tag but it doesn't close itself, do so
459 elseif ($tag == 'br' || $tag == 'img' || $tag == 'hr' || $tag == 'input') {
461 } else { // Push the tag onto the stack
462 // If the top of the stack is the same as the tag we want to push, close previous tag
463 if (($stacksize > 0) && ($tag != 'div') && ($tagstack[$stacksize - 1] == $tag)) {
464 $tagqueue = '</' . array_pop ($tagstack) . '>';
467 $stacksize = array_push ($tagstack, $tag);
471 $attributes = $regex[2];
473 $attributes = ' '.$attributes;
475 $tag = '<'.$tag.$attributes.'>';
476 //If already queuing a close tag, then put this tag on, too
482 $newtext .= substr($text,0,$i) . $tag;
483 $text = substr($text,$i+$l);
487 $newtext .= $tagqueue;
489 // Add Remaining text
493 while($x = array_pop($tagstack)) {
494 $newtext .= '</' . $x . '>'; // Add remaining tags to close
497 // WP fix for the bug with HTML comments
498 $newtext = str_replace("< !--","<!--",$newtext);
499 $newtext = str_replace("< !--","< !--",$newtext);
505 function format_to_edit($content, $richedit = false) {
506 $content = apply_filters('format_to_edit', $content);
508 $content = htmlspecialchars($content);
512 function format_to_post($content) {
514 $content = apply_filters('format_to_post', $content);
518 function zeroise($number,$threshold) { // function to add leading zeros when necessary
519 return sprintf('%0'.$threshold.'s', $number);
523 function backslashit($string) {
524 $string = preg_replace('/([a-z])/i', '\\\\\1', $string);
528 function trailingslashit($string) {
529 if ( '/' != substr($string, -1)) {
535 function addslashes_gpc($gpc) {
538 if (get_magic_quotes_gpc()) {
539 $gpc = stripslashes($gpc);
542 return $wpdb->escape($gpc);
546 function stripslashes_deep($value)
548 $value = is_array($value) ?
549 array_map('stripslashes_deep', $value) :
550 stripslashes($value);
555 function antispambot($emailaddy, $mailto=0) {
556 $emailNOSPAMaddy = '';
557 srand ((float) microtime() * 1000000);
558 for ($i = 0; $i < strlen($emailaddy); $i = $i + 1) {
559 $j = floor(rand(0, 1+$mailto));
561 $emailNOSPAMaddy .= '&#'.ord(substr($emailaddy,$i,1)).';';
563 $emailNOSPAMaddy .= substr($emailaddy,$i,1);
565 $emailNOSPAMaddy .= '%'.zeroise(dechex(ord(substr($emailaddy, $i, 1))), 2);
568 $emailNOSPAMaddy = str_replace('@','@',$emailNOSPAMaddy);
569 return $emailNOSPAMaddy;
572 function make_clickable($ret) {
573 $ret = ' ' . $ret . ' ';
574 $ret = preg_replace("#([\s>])(https?)://([^\s<>{}()]+[^\s.,<>{}()])#i", "$1<a href='$2://$3' rel='nofollow'>$2://$3</a>", $ret);
575 $ret = preg_replace("#(\s)www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#i", "$1<a href='http://www.$2.$3$4' rel='nofollow'>www.$2.$3$4</a>", $ret);
576 $ret = preg_replace("#(\s)([a-z0-9\-_.]+)@([a-z0-9\-_.]+)\.([^,< \n\r]+)#i", "$1<a href=\"mailto:$2@$3.$4\">$2@$3.$4</a>", $ret);
581 function wp_rel_nofollow( $text ) {
582 $text = preg_replace('|<a (.+?)>|i', '<a $1 rel="nofollow">', $text);
586 function convert_smilies($text) {
587 global $wp_smiliessearch, $wp_smiliesreplace;
589 if (get_settings('use_smilies')) {
590 // HTML loop taken from texturize function, could possible be consolidated
591 $textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between
592 $stop = count($textarr);// loop stuff
593 for ($i = 0; $i < $stop; $i++) {
594 $content = $textarr[$i];
595 if ((strlen($content) > 0) && ('<' != $content{0})) { // If it's not a tag
596 $content = str_replace($wp_smiliessearch, $wp_smiliesreplace, $content);
601 // return default text.
608 function is_email($user_email) {
609 $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
610 if(strstr($user_email, '@') && strstr($user_email, '.')) {
611 if (preg_match($chars, $user_email)) {
621 // used by wp-mail to handle charsets in email subjects
622 function wp_iso_descrambler($string) {
623 /* this may only work with iso-8859-1, I'm afraid */
624 if (!preg_match('#\=\?(.+)\?Q\?(.+)\?\=#i', $string, $matches)) {
627 $subject = str_replace('_', ' ', $matches[2]);
628 $subject = preg_replace('#\=([0-9a-f]{2})#ei', "chr(hexdec(strtolower('$1')))", $subject);
634 // give it a date, it will give you the same date as GMT
635 function get_gmt_from_date($string) {
636 // note: this only substracts $time_difference from the given date
637 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);
638 $string_time = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
639 $string_gmt = gmdate('Y-m-d H:i:s', $string_time - get_settings('gmt_offset') * 3600);
643 // give it a GMT date, it will give you the same date with $time_difference added
644 function get_date_from_gmt($string) {
645 // note: this only adds $time_difference to the given date
646 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);
647 $string_time = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
648 $string_localtime = gmdate('Y-m-d H:i:s', $string_time + get_settings('gmt_offset')*3600);
649 return $string_localtime;
652 // computes an offset in seconds from an iso8601 timezone
653 function iso8601_timezone_to_offset($timezone) {
654 // $timezone is either 'Z' or '[+|-]hhmm'
655 if ($timezone == 'Z') {
658 $sign = (substr($timezone, 0, 1) == '+') ? 1 : -1;
659 $hours = intval(substr($timezone, 1, 2));
660 $minutes = intval(substr($timezone, 3, 4)) / 60;
661 $offset = $sign * 3600 * ($hours + $minutes);
666 // converts an iso8601 date to MySQL DateTime format used by post_date[_gmt]
667 function iso8601_to_datetime($date_string, $timezone = USER) {
668 if ($timezone == GMT) {
669 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);
670 if (!empty($date_bits[7])) { // we have a timezone, so let's compute an offset
671 $offset = iso8601_timezone_to_offset($date_bits[7]);
672 } else { // we don't have a timezone, so we assume user local timezone (not server's!)
673 $offset = 3600 * get_settings('gmt_offset');
675 $timestamp = gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]);
676 $timestamp -= $offset;
677 return gmdate('Y-m-d H:i:s', $timestamp);
678 } elseif ($timezone == USER) {
679 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);
683 function popuplinks($text) {
684 // Comment text in popup windows should be filtered through this.
685 // Right now it's a moderately dumb function, ideally it would detect whether
686 // a target or rel attribute was already there and adjust its actions accordingly.
687 $text = preg_replace('/<a (.+?)>/i', "<a $1 target='_blank' rel='external'>", $text);
691 function sanitize_email($email) {
692 return preg_replace('/[^a-z0-9+_.@-]/i', '', $email);
695 function human_time_diff( $from, $to = '' ) {
698 $diff = (int) abs($to - $from);
700 $mins = round($diff / 60);
702 $since = __('1 min');
704 $since = sprintf( __('%s mins'), $mins);
705 } else if (($diff <= 86400) && ($diff > 3600)) {
706 $hours = round($diff / 3600);
708 $since = __('1 hour');
710 $since = sprintf( __('%s hours'), $hours );
711 } elseif ($diff >= 86400) {
712 $days = round($diff / 86400);
714 $since = __('1 day');
716 $since = sprintf( __('%s days'), $days );
721 function wp_trim_excerpt($text) { // Fakes an excerpt if needed
724 $text = $post->post_content;
725 $text = apply_filters('the_content', $text);
726 $text = str_replace(']]>', ']]>', $text);
727 $text = strip_tags($text);
728 $excerpt_length = 55;
729 $words = explode(' ', $text, $excerpt_length + 1);
730 if (count($words) > $excerpt_length) {
732 array_push($words, '[...]');
733 $text = implode(' ', $words);
739 function ent2ncr($text) {
743 '⁄' => '/',
747 ' ' => ' ',
748 '¡' => '¡',
749 '¢' => '¢',
750 '£' => '£',
751 '¤' => '¤',
753 '¦' => '¦',
754 '&brkbar;' => '¦',
755 '§' => '§',
758 '©' => '©',
759 'ª' => 'ª',
760 '«' => '«',
764 '¯' => '¯',
765 '&hibar;' => '¯',
767 '±' => '±',
768 '²' => '²',
769 '³' => '³',
770 '´' => '´',
771 'µ' => 'µ',
772 '¶' => '¶',
773 '·' => '·',
774 '¸' => '¸',
775 '¹' => '¹',
776 'º' => 'º',
777 '»' => '»',
778 '¼' => '¼',
779 '½' => '½',
780 '¾' => '¾',
781 '¿' => '¿',
782 'À' => 'À',
783 'Á' => 'Á',
784 'Â' => 'Â',
785 'Ã' => 'Ã',
786 'Ä' => 'Ä',
787 'Å' => 'Å',
788 'Æ' => 'Æ',
789 'Ç' => 'Ç',
790 'È' => 'È',
791 'É' => 'É',
792 'Ê' => 'Ê',
793 'Ë' => 'Ë',
794 'Ì' => 'Ì',
795 'Í' => 'Í',
796 'Î' => 'Î',
797 'Ï' => 'Ï',
799 'Ñ' => 'Ñ',
800 'Ò' => 'Ò',
801 'Ó' => 'Ó',
802 'Ô' => 'Ô',
803 'Õ' => 'Õ',
804 'Ö' => 'Ö',
805 '×' => '×',
806 'Ø' => 'Ø',
807 'Ù' => 'Ù',
808 'Ú' => 'Ú',
809 'Û' => 'Û',
810 'Ü' => 'Ü',
811 'Ý' => 'Ý',
812 'Þ' => 'Þ',
813 'ß' => 'ß',
814 'à' => 'à',
815 'á' => 'á',
816 'â' => 'â',
817 'ã' => 'ã',
818 'ä' => 'ä',
819 'å' => 'å',
820 'æ' => 'æ',
821 'ç' => 'ç',
822 'è' => 'è',
823 'é' => 'é',
824 'ê' => 'ê',
825 'ë' => 'ë',
826 'ì' => 'ì',
827 'í' => 'í',
828 'î' => 'î',
829 'ï' => 'ï',
831 'ñ' => 'ñ',
832 'ò' => 'ò',
833 'ó' => 'ó',
834 'ô' => 'ô',
835 'õ' => 'õ',
836 'ö' => 'ö',
837 '÷' => '÷',
838 'ø' => 'ø',
839 'ù' => 'ù',
840 'ú' => 'ú',
841 'û' => 'û',
842 'ü' => 'ü',
843 'ý' => 'ý',
844 'þ' => 'þ',
845 'ÿ' => 'ÿ',
846 'Œ' => 'Œ',
847 'œ' => 'œ',
848 'Š' => 'Š',
849 'š' => 'š',
850 'Ÿ' => 'Ÿ',
851 'ƒ' => 'ƒ',
852 'ˆ' => 'ˆ',
853 '˜' => '˜',
854 'Α' => 'Α',
855 'Β' => 'Β',
856 'Γ' => 'Γ',
857 'Δ' => 'Δ',
858 'Ε' => 'Ε',
859 'Ζ' => 'Ζ',
861 'Θ' => 'Θ',
862 'Ι' => 'Ι',
863 'Κ' => 'Κ',
864 'Λ' => 'Λ',
868 'Ο' => 'Ο',
871 'Σ' => 'Σ',
873 'Υ' => 'Υ',
877 'Ω' => 'Ω',
878 'α' => 'α',
879 'β' => 'β',
880 'γ' => 'γ',
881 'δ' => 'δ',
882 'ε' => 'ε',
883 'ζ' => 'ζ',
885 'θ' => 'θ',
886 'ι' => 'ι',
887 'κ' => 'κ',
888 'λ' => 'λ',
892 'ο' => 'ο',
895 'ς' => 'ς',
896 'σ' => 'σ',
898 'υ' => 'υ',
902 'ω' => 'ω',
903 'ϑ' => 'ϑ',
904 'ϒ' => 'ϒ',
906 ' ' => ' ',
907 ' ' => ' ',
908 ' ' => ' ',
909 '‌' => '‌',
910 '‍' => '‍',
911 '‎' => '‎',
912 '‏' => '‏',
913 '–' => '–',
914 '—' => '—',
915 '‘' => '‘',
916 '’' => '’',
917 '‚' => '‚',
918 '“' => '“',
919 '”' => '”',
920 '„' => '„',
921 '†' => '†',
922 '‡' => '‡',
923 '•' => '•',
924 '…' => '…',
925 '‰' => '‰',
926 '′' => '′',
927 '″' => '″',
928 '‹' => '‹',
929 '›' => '›',
930 '‾' => '‾',
931 '⁄' => '⁄',
932 '€' => '€',
933 'ℑ' => 'ℑ',
934 '℘' => '℘',
935 'ℜ' => 'ℜ',
936 '™' => '™',
937 'ℵ' => 'ℵ',
938 '↵' => '↵',
939 '⇐' => '⇐',
940 '⇑' => '⇑',
941 '⇒' => '⇒',
942 '⇓' => '⇓',
943 '⇔' => '⇔',
944 '∀' => '∀',
945 '∂' => '∂',
946 '∃' => '∃',
947 '∅' => '∅',
948 '∇' => '∇',
949 '∈' => '∈',
950 '∉' => '∉',
952 '∏' => '∏',
953 '∑' => '∑',
954 '−' => '−',
955 '∗' => '∗',
956 '√' => '√',
957 '∝' => '∝',
958 '∞' => '∞',
959 '∠' => '∠',
960 '∧' => '∧',
962 '∩' => '∩',
963 '∪' => '∪',
964 '∫' => '∫',
965 '∴' => '∴',
966 '∼' => '∼',
967 '≅' => '≅',
968 '≈' => '≈',
970 '≡' => '≡',
973 '⊂' => '⊂',
974 '⊃' => '⊃',
975 '⊄' => '⊄',
976 '⊆' => '⊆',
977 '⊇' => '⊇',
978 '⊕' => '⊕',
979 '⊗' => '⊗',
980 '⊥' => '⊥',
981 '⋅' => '⋅',
982 '⌈' => '⌈',
983 '⌉' => '⌉',
984 '⌊' => '⌊',
985 '⌋' => '⌋',
986 '⟨' => '〈',
987 '⟩' => '〉',
988 '←' => '←',
989 '↑' => '↑',
990 '→' => '→',
991 '↓' => '↓',
992 '↔' => '↔',
993 '◊' => '◊',
994 '♠' => '♠',
995 '♣' => '♣',
996 '♥' => '♥',
997 '♦' => '♦'
1000 foreach ($to_ncr as $entity => $ncr) {
1001 $text = str_replace($entity, $ncr, $text);
1006 function wp_richedit_pre($text) {
1007 // Filtering a blank results in an annoying <br />\n
1008 if ( empty($text) ) return apply_filters('richedit_pre', '');
1011 $output = convert_chars($output);
1012 $output = wpautop($output);
1014 // These must be double-escaped or planets will collide.
1015 $output = str_replace('<', '&lt;', $output);
1016 $output = str_replace('>', '&gt;', $output);
1018 return apply_filters('richedit_pre', $output);