в настоящее время я заменяю все свои кавычки внутри текста специальными кавычками. Но как я могу изменить свое регулярное выражение, которое будет заменено только кавычками внутри текста, а не те, которые используются в тэгах html.
$text = preg_replace('/"(?=\w)/', "»", $text); $text = preg_replace('/(?<=\w)"/', "«", $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 »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 »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>
EDIT 2
Thx для ответа Kamehameha, я добавил следующий код в мой скрипт:
$text = preg_replace("/\"([^<>]*?)\"(?=[^>]+?<)/", "»\1«", $text);
То, что отлично работало в тесте регулярных выражений, ничего не заменяет. Я сделал что-то неправильно?
Это регулярное выражение работает для данных строк.
Search for - "([^<>]*?)"(?=[^>]*?<) Replace with - »\1«
Демо здесь
Тестирование –
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 »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>
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('/"([^<>]*?)"(?=[^>]*?<)/', '»\1«', $str));
Это выход –
/** OUTPUT **/ string '<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>' (length=196)
EDIT 2-
Вы правильно preg_replace
функцию preg_replace
, но в заменяющей строке вы использовали \ 1 внутри двойных кавычек (""). Таким образом, вы избегаете самого 1, и это не будет заменено.
Чтобы сделать его более понятным, попробуйте это и посмотрите, что произойдет –
echo '»\1«'; echo "»\1«";
Второй \ 1 не должен быть видимым.
Таким образом, решение будет одним из них –
preg_replace('/"([^<>]*?)"(?=[^>]*?<)/', '»\1«', $str) preg_replace("/\"([^<>]*?)\"(?=[^>]*?<)/", "»\\1«", $str) preg_replace("/\"([^<>]*?)\"(?=[^>]*?<)/", "»$1«", $str)
Прочтите раздел «Замена» на этой странице для большей ясности.
EDIT 3-
Регулярное выражение, которое охватывает текст, который не может быть заключен в теги,
\"([^<>]*?)\"(?=(?:[^>]*?(?:<|$)))
Демо здесь
Также можно использовать отрицательный результат:
(?![^<]*>)"([^"]+)"
Замените: »\1«
Для записи есть простое PHP-решение, которое не упоминалось и которое эффективно пропускает все теги <a <a...</a>
a>.
Поиск: <a.*?<\/a>(*SKIP)(*F)|"([^"]*)"
Заменить: »\1«
В демоверсии посмотрите на подстановки внизу.
Справка
Как сопоставить (или заменить) шаблон, за исключением ситуаций s1, s2, s3 …
Используйте это регулярное выражение:
(?<=^|>)[^><]+?(?=<|$)
Это будет соответствовать строкам без html.
А затем сделайте свое регулярное выражение на результирующей строке