Regex ignoruje dopasowania między tagami <script>
Przepraszam, ponieważ mam bardzo małą wiedzę na temat Regex i nawet nie rozumiem dokładnie, co robi ten regex (nie napisałem tego -źródło) oprócz tego, że szuka określonego terminu, aby można go było podświetlić.
Oto regex:
/(\b$term|$term\b)(?!([^<]+)?>)/iu
Problem polega na tym, że muszę się upewnić, że nie pasuje do niczego<script>
i</script>
tagi. Teraz wiem, że istnieje wiele odmian tego, w jaki sposób można napisać tag skryptu, ale naprawdę wszystko, czego potrzebuję, to zignorować dowolny tekst między<script
i/script>
biorąc pod uwagę możliwe białe znaki międzyscript
i<
lubić< script
lub/script >
.
Czy ktoś jest w stanie zmodyfikować to w ten sposób? Powiadomię autora wtyczki, który napisał ten reg-ex, o dołączeniu do przyszłych wydań.
Edytować: Oto funkcja, z której pochodzi:
function relevanssi_highlight_terms($excerpt, $query) {
$type = get_option("relevanssi_highlight");
if ("none" == $type) {
return $excerpt;
}
switch ($type) {
case "mark": // thanks to Jeff Byrnes
$start_emp = "<mark>";
$end_emp = "</mark>";
break;
case "strong":
$start_emp = "<strong>";
$end_emp = "</strong>";
break;
case "em":
$start_emp = "<em>";
$end_emp = "</em>";
break;
case "col":
$col = get_option("relevanssi_txt_col");
if (!$col) $col = "#ff0000";
$start_emp = "<span style='color: $col'>";
$end_emp = "</span>";
break;
case "bgcol":
$col = get_option("relevanssi_bg_col");
if (!$col) $col = "#ff0000";
$start_emp = "<span style='background-color: $col'>";
$end_emp = "</span>";
break;
case "css":
$css = get_option("relevanssi_css");
if (!$css) $css = "color: #ff0000";
$start_emp = "<span style='$css'>";
$end_emp = "</span>";
break;
case "class":
$css = get_option("relevanssi_class");
if (!$css) $css = "relevanssi-query-term";
$start_emp = "<span class='$css'>";
$end_emp = "</span>";
break;
default:
return $excerpt;
}
$start_emp_token = "*[/";
$end_emp_token = "\]*";
if ( function_exists('mb_internal_encoding') )
mb_internal_encoding("UTF-8");
$terms = array_keys(relevanssi_tokenize($query, $remove_stopwords = true));
$phrases = relevanssi_extract_phrases(stripslashes($query));
$non_phrase_terms = array();
foreach ($phrases as $phrase) {
$phrase_terms = array_keys(relevanssi_tokenize($phrase, false));
foreach ($terms as $term) {
if (!in_array($term, $phrase_terms)) {
$non_phrase_terms[] = $term;
}
}
$terms = $non_phrase_terms;
$terms[] = $phrase;
}
usort($terms, 'relevanssi_strlen_sort');
get_option('relevanssi_word_boundaries', 'on') == 'on' ? $word_boundaries = true : $word_boundaries = false;
foreach ($terms as $term) {
$pr_term = preg_quote($term, '/');
if ($word_boundaries) {
$excerpt = preg_replace("/(\b$pr_term|$pr_term\b)(?!([^<]+)?>)/iu", $start_emp_token . '\\1' . $end_emp_token, $excerpt);
}
else {
$excerpt = preg_replace("/($pr_term)(?!([^<]+)?>)/iu", $start_emp_token . '\\1' . $end_emp_token, $excerpt);
}
// thanks to http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/
}
$excerpt = relevanssi_remove_nested_highlights($excerpt, $start_emp_token, $end_emp_token);
$excerpt = str_replace($start_emp_token, $start_emp, $excerpt);
$excerpt = str_replace($end_emp_token, $end_emp, $excerpt);
$excerpt = str_replace($end_emp . $start_emp, "", $excerpt);
if (function_exists('mb_ereg_replace')) {
$pattern = $end_emp . '\s*' . $start_emp;
$excerpt = mb_ereg_replace($pattern, " ", $excerpt);
}
return $excerpt;
}