View Single Post
  #8  
Old 11-07-2013, 07:55 PM
schan schan is offline
 
Join Date: Sep 2013
Posts: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Just a bit of background info: the goal of this function is correct the text that gets sent to it. The function utilizes regex patterns to determine what needs fixing and when.

I can't post the full code, but I will try to post enough so that it gives you guys enough information to have an idea of what could be going on. Do keep in mind that it takes about 30 seconds to complete correcting 1000 posts. The 30 secs may be normal, but since it's running as a cron job, it should not render the page unusable since it's running in the background...at least it should be. Just in case you guys are wondering where's the query, I've tested that the query completes about 1/10 of a second or even faster. The "stall" occurs when the page text gets sent to the fix_spelling function. Anyways, here's the code:

Code:
<?php

public function fix_spelling($text, $severity = 0, $exceptions = array()) {

    list($rgx_start, $rgx_end_replace) = 
        array('(?<=[ .,!?>\]\r\n]|^)', '(?=[ .,!?<\[\r\n]|$)');

    $rgx_end_delete = '( |(?=[.,!?\[\r\n]|$))';

    // $this->dictionary is a multi-dimensional array filled with ~4000 elements.
    // An element consists of multiple attributes, (corrected_word, error_weight and others)

    foreach($this->dictionary as $word=>$prop) {

    	// this line might be problematic due to in_array being called 4000 times
    	if(stripos($text, $word) !== FALSE && !in_array($word, $exceptions)) {

    		// some initialization based on value of $prop[corrected_word] takes
    		// place here ....finally, we call a preg-replace on a match

    		$text = preg_replace("variables that contain regex goes here (i.e. $rgx_start and so on)", "corrected_word goes here", $text, -1, $count);

    		if($count) {
    			// We want to highlight the corrected words so users know what was corrected
    			// Initialize highlight with another preg_replace goes here...syntax is similar to $text
    			$highlight = preg_replace("....");
    		}
    	}
    }

    // we want to capitalize i but there are some cases where we shouldn't, such as i.e.
    // do a preg_match for some special cases
    $rgx_list = preg_match("....");
    // call a preg_replace again on $text
    $text = preg_replace("....$rgx_list, ....");

    // if replacements occurred $count is set
    if($count)
    	$highlight = preg_replace(".....");

    // now we also want to have special corrections in case the post is a Math-based post
    if(preg_match("regex patterns for math keywords such as sin, pi, theta and so on")) {
    	// do something ..jsut a variable initialization
    }

    // fix single letters such as b, n, r, u, y => be, and, are, you, why respectively
    list($rgx1, $rgx_start, $rgx_end) = array('regex pattern1', 'regex pattern2', 'regex pattern3');

    // this foreach loop should only run 5 times...the length of the array holding the "b, n, r, u, y"
    foreach ($letters as $letter=>$fix) {
    	// There are two if statements which does two preg_replace each...the 2nd preg_replace will only happen if the 1st preg_replace found replacements (i.e. $count is set)

    }

    ....
    // There are a total of 8 more preg_replace calls total and 2 preg_matches
    .....
    return array(array($text, $highlight), $error_score);
}
Reply With Quote
 
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01010 seconds
  • Memory Usage 1,774KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD_SHOWPOST
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)bbcode_code
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • reputationlevel
  • showthread
Included Files:
  • ./showpost.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showpost_start
  • bbcode_fetch_tags
  • bbcode_create
  • postbit_factory
  • showpost_post
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • showpost_complete