wordword word"; $str = preg_replace("/word(?!([^<]+)?>)/i","repl",$str); echo $str; # repl
repl ?>источник: http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/
Unfortunality для моего проекта нужно семантическое, освобождает доступный только для Java...
//Спасибо Celso
Используйте метод String.replaceAll ():
class Test {
public static void main(String[] args) {
String str = "word <a href=\"word\">word</word>word word";
str = str.replaceAll("word(?!([^<]+)?>)", "repl");
System.out.println(str);
}
}
Надеюсь, это поможет.
Чтобы преобразовать это регулярное выражение для использования в Java, все, что вам нужно сделать, это избавиться от разделителей /
и заменить конечный i
на встроенный модификатор (? i)
. Но это не очень хорошее регулярное выражение; Вместо этого я бы использовал это:
(?i)word(?![^<>]++>)
Согласно функции отладки RegexBuddy, когда она пытается сопоставить слово
в
, исходное регулярное выражение требует 23 шага чтобы отвергнуть его, в то время как этот занимает всего семь шагов. Фактический код Java:
str = str.replaceAll("(?i)word(?![^<>]++>)", "repl");
Прежде чем дать дальнейший ответ, вы пытаетесь разобрать html-документ? В таком случае не используйте регулярные выражения, используйте парсер html.