Заменить все кавычки, которые не указаны в html-тегах

в настоящее время я заменяю все свои кавычки внутри текста специальными кавычками. Но как я могу изменить свое регулярное выражение, которое будет заменено только кавычками внутри текста, а не те, которые используются в тэгах html.

$text = preg_replace('/"(?=\w)/', "&raquo;", $text); $text = preg_replace('/(?<=\w)"/', "&laquo;", $text); 

Я не так привык к регулярным выражениям. Проблема в том, что мне нужно заменить стартовые кавычки другим символом, чем заканчивать кавычки.

Если вам нужна дополнительная информация, скажите так.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ

Прецедент

 <p>This is a "wonderful long text". At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p> 

Ожидаемый результат должен быть:

 <p>This is a &raquo;wonderful long text&laquo;. At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p> 

Сейчас это так:

 <p>This is a &raquo;wonderful long text&laquo;. At least it should be. Here we have a <a href=&raquo;http://wwww.site-to-nowhere.com&laquo; target=&raquo;_blank&laquo;>link</a>.</p> 

EDIT 2

Thx для ответа Kamehameha, я добавил следующий код в мой скрипт:

$text = preg_replace("/\"([^<>]*?)\"(?=[^>]+?<)/", "&raquo;\1&laquo;", $text);

То, что отлично работало в тесте регулярных выражений, ничего не заменяет. Я сделал что-то неправильно?

Это регулярное выражение работает для данных строк.

 Search for - "([^<>]*?)"(?=[^>]*?<) Replace with - &raquo;\1&laquo; 

Демо здесь
Тестирование –

 INPUT - <p>This is a "wonderful long text". "Another wonderful ong text" At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p> OUTPUT - <p>This is a &raquo;wonderful long text&laquo;. &raquo;Another wonderful ong text&laquo; At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p> 

EDIT 1-
Выполнение этого в PHP –

 $str = '<p>This is a "wonderful long text". "Another wonderful ong text" At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p>'; var_dump(preg_replace('/"([^<>]*?)"(?=[^>]*?<)/', '&raquo;\1&laquo', $str)); 

Это выход –

 /** OUTPUT **/ string '<p>This is a &raquo;wonderful long text&laquo. &raquo;Another wonderful ong text&laquo At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>.</p>' (length=196) 

EDIT 2-
Вы правильно preg_replace функцию preg_replace , но в заменяющей строке вы использовали \ 1 внутри двойных кавычек (""). Таким образом, вы избегаете самого 1, и это не будет заменено.
Чтобы сделать его более понятным, попробуйте это и посмотрите, что произойдет –

 echo '&raquo;\1&laquo;'; echo "&raquo;\1&laquo;"; 

Второй \ 1 не должен быть видимым.
Таким образом, решение будет одним из них –

 preg_replace('/"([^<>]*?)"(?=[^>]*?<)/', '&raquo;\1&laquo;', $str) preg_replace("/\"([^<>]*?)\"(?=[^>]*?<)/", "&raquo;\\1&laquo;", $str) preg_replace("/\"([^<>]*?)\"(?=[^>]*?<)/", "&raquo;$1&laquo;", $str) 

Прочтите раздел «Замена» на этой странице для большей ясности.

EDIT 3-
Регулярное выражение, которое охватывает текст, который не может быть заключен в теги,

 \"([^<>]*?)\"(?=(?:[^>]*?(?:<|$))) 

Демо здесь

Также можно использовать отрицательный результат:

 (?![^<]*>)"([^"]+)" 

Замените: &raquo;\1&laquo;

Для записи есть простое PHP-решение, которое не упоминалось и которое эффективно пропускает все теги <a <a...</a> a>.

Поиск: <a.*?<\/a>(*SKIP)(*F)|"([^"]*)"

Заменить: &raquo;\1&laquo;

В демоверсии посмотрите на подстановки внизу.

Справка

Как сопоставить (или заменить) шаблон, за исключением ситуаций s1, s2, s3 …

Используйте это регулярное выражение:

 (?<=^|>)[^><]+?(?=<|$) 

Это будет соответствовать строкам без html.

А затем сделайте свое регулярное выражение на результирующей строке