<?php $str = "word <a href=\"word\">word</word>word word"; $str = preg_replace("/word(?!([^<]+)?>)/i","repl",$str); echo $str; # repl <word word="word">repl</word> ?>
источник: http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/
К сожалению, моему проекту нужны семантические библиотеки, доступные только для 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, все, что вам нужно сделать, это избавиться от /
delimiters и изменить конечный i
на встроенный модификатор (?i)
. Но это не очень хорошее регулярное выражение; Я бы использовал это вместо этого:
(?i)word(?![^<>]++>)
Согласно функции Debug от RegexBuddy, когда он пытается сопоставить word
в <a href="word">
, исходное регулярное выражение требует 23 шага, чтобы отклонить его, в то время как это занимает всего семь шагов. Фактический код Java
str = str.replaceAll("(?i)word(?![^<>]++>)", "repl");
Прежде чем предоставить дополнительный ответ, пытаетесь ли вы проанализировать html-документ? Если это так, не используйте регулярные выражения, используйте синтаксический анализатор html.