Project

General

Profile

« Previous | Next » 

Revision 857

Added by thorn about 16 years ago

search: fixed windows-related regex issue

View differences:

search_modext.php
90 90
	$excerpt_array = array();
91 91
	$word = '('.implode('|', $search_words).')';
92 92
	// Build the regex-string
93
	// start-sign: .!?; + INVERTED EXCLAMATION MARK - INVERTED QUESTION MARK - DOUBLE EXCLAMATION MARK - INTERROBANG - EXCLAMATION QUESTION MARK - QUESTION EXCLAMATION MARK - DOUBLE QUESTION MARK - HALFWIDTH IDEOGRAPHIC FULL STOP - IDEOGRAPHIC FULL STOP - IDEOGRAPHIC COMMA
94
	$str1=".!?;"."\xC2\xA1"."\xC2\xBF"."\xE2\x80\xBC"."\xE2\x80\xBD"."\xE2\x81\x89"."\xE2\x81\x88"."\xE2\x81\x87"."\xEF\xBD\xA1"."\xE3\x80\x82"."\xE3\x80\x81";
95
	// stop-sign: .!?; + DOUBLE EXCLAMATION MARK - INTERROBANG - EXCLAMATION QUESTION MARK - QUESTION EXCLAMATION MARK - DOUBLE QUESTION MARK - HALFWIDTH IDEOGRAPHIC FULL STOP - IDEOGRAPHIC FULL STOP - IDEOGRAPHIC COMMA
96
	$str2=".!?;"."\xE2\x80\xBC"."\xE2\x80\xBD"."\xE2\x81\x89"."\xE2\x81\x88"."\xE2\x81\x87"."\xEF\xBD\xA1"."\xE3\x80\x82"."\xE3\x80\x81";
97
	$regex='/(?:^|\b|['.$str1.'])([^'.$str1.']{0,200}?'.$word.'[^'.$str2.']{0,200}(?:['.$str2.']|\b|$))/Sisu';
98
	if(version_compare(PHP_VERSION, '4.3.3', '>=')) {
93
	if(strpos(strtoupper(PHP_OS), 'WIN')===0) { // windows -> see below
94
		$str1=".!?;";
95
		$str2=".!?;";
96
	} else { // linux & Co.
97
		// start-sign: .!?; + INVERTED EXCLAMATION MARK - INVERTED QUESTION MARK - DOUBLE EXCLAMATION MARK - INTERROBANG - EXCLAMATION QUESTION MARK - QUESTION EXCLAMATION MARK - DOUBLE QUESTION MARK - HALFWIDTH IDEOGRAPHIC FULL STOP - IDEOGRAPHIC FULL STOP - IDEOGRAPHIC COMMA
98
		$str1=".!?;"."\xC2\xA1"."\xC2\xBF"."\xE2\x80\xBC"."\xE2\x80\xBD"."\xE2\x81\x89"."\xE2\x81\x88"."\xE2\x81\x87"."\xEF\xBD\xA1"."\xE3\x80\x82"."\xE3\x80\x81";
99
		// stop-sign: .!?; + DOUBLE EXCLAMATION MARK - INTERROBANG - EXCLAMATION QUESTION MARK - QUESTION EXCLAMATION MARK - DOUBLE QUESTION MARK - HALFWIDTH IDEOGRAPHIC FULL STOP - IDEOGRAPHIC FULL STOP - IDEOGRAPHIC COMMA
100
		$str2=".!?;"."\xE2\x80\xBC"."\xE2\x80\xBD"."\xE2\x81\x89"."\xE2\x81\x88"."\xE2\x81\x87"."\xEF\xBD\xA1"."\xE3\x80\x82"."\xE3\x80\x81";
101
	}
102
	$regex='/(?:^|\b|['.$str1.'])([^'.$str1.']{0,200}?'.$word.'[^'.$str2.']{0,200}(?:['.$str2.']|\b|$))/isu';
103
	if(version_compare(PHP_VERSION, '4.3.3', '>=') &&
104
	strpos(strtoupper(PHP_OS), 'WIN')!==0) { // this may crash windows server, so skip if on windows
99 105
		// jump from match to match, get excerpt, stop if $max_excerpt_num is reached
100 106
		$last_end = 0; $offset = 0;
101 107
		while(preg_match('/'.$word.'/Sisu', $text, $match_array, PREG_OFFSET_CAPTURE, $last_end)) {
102 108
			$offset = ($match_array[0][1]-206 < $last_end)?$last_end:$match_array[0][1]-206;
103 109
			if(preg_match($regex, $text, $matches, PREG_OFFSET_CAPTURE, $offset)) {
104 110
				$last_end = $matches[1][1]+strlen($matches[1][0])-1;
105
				if(!preg_match('/\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\./S', $matches[1][0])) // skip excerpts with email-addresses
111
				if(!preg_match('/\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\./', $matches[1][0])) // skip excerpts with email-addresses
106 112
					$excerpt_array[] = trim($matches[1][0]);
107 113
				if(count($excerpt_array)>=$max_excerpt_num) {
108 114
					$excerpt_array = array_unique($excerpt_array);
......
116 122
	} else { // compatile, but may be very slow with many large pages
117 123
		if(preg_match_all($regex, $text, $match_array)) {
118 124
			foreach($match_array[1] AS $string) {
119
				if(!preg_match('/\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\./S', $string)) // skip excerpts with email-addresses
125
				if(!preg_match('/\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\./', $string)) // skip excerpts with email-addresses
120 126
					$excerpt_array[] = trim($string);
121 127
			}
122 128
		}
......
233 239
	if($mod_no_highlight) // no highlighting
234 240
		{ $mod_page_link_target = "&amp;nohighlight=1".$mod_page_link_target; }
235 241
	// clean the text:
236
	$mod_text = preg_replace('/\s+/', ' ', $mod_text);
237 242
	$mod_text = preg_replace('#<(!--.*--|style.*</style|script.*</script)>#SiU', ' ', $mod_text);
238 243
	$mod_text = preg_replace('#<(br( /)?|dt|/dd|/?(h[1-6]|tr|table|p|li|ul|pre|code|div|hr))[^>]*>#Si', '.', $mod_text);
244
	$mod_text = preg_replace('/\s+/', ' ', $mod_text);
245
	$mod_text = preg_replace('/ \./', '.', $mod_text);
239 246
	$mod_text = entities_to_umlauts($mod_text, 'UTF-8');
240 247
	$anchor_text = $mod_text; // make an copy containing html-tags
241 248
	$mod_text = strip_tags($mod_text);

Also available in: Unified diff