Итак, я типографский нацист (они похожи на граммар-наци на стероидах), и у меня есть строка, которая может содержать многоуровневые двойные кавычки, например:
$str = 'Outer text "first level "second level "third level" second level" first level" outer text';
В моем родном языке типографически правильным является максимум трехуровневое цитирование, причем каждый уровень имеет свой собственный знак кавычек. Я хотел бы заменить все пары с двойными кавычками на соответствующие объекты, чтобы:
- 1-й уровень: текст (
„
и”
) - 2-й уровень: текст (
»
и«
) - 3-й уровень: текст (
’
) - любые дополнительные уровни: текст (
’
)
Таким образом, приведенный выше текст будет выводиться как:
Внешний текст первый уровень второй уровень третий уровень второй уровень первый уровень внешний текст
Кроме того, возможно, что в строке есть одноуровневые пары ""
:
$str = 'Quote from my book: "She didn\'t feel "depressed", "tired" or "sad"."';
Таким образом, это будет выводиться как:
Цитата из моей книги: Она не чувствовала себя подавленной, усталой или грустной.
(Это может быть сложно, но мы знаем, что за "
всегда следует или предшествует пробел , or punctuation
,
, .
, ;
, ?
, !
)
Наконец, $str
может также содержать HTML, где кавычки атрибутов не следует менять:
$str = '<p class="quote">The error said: <span class="error_msg">"Please restart your "fancy" computer!"</span></p>';
Я слышал, что использование рекурсивного регулярного выражения было бы возможным решением, но я ищу более эффективный способ, потому что строки могут быть длинными HTML-текстами.
ОБНОВЛЕНИЕ. Кажется, я пропустил свойство CSS quotes
и элемент <q>
. Это делает встроенные кавычки более элегантными.
"b" m "c"
может быть„b” m „c”
или также может быть„b» m «c”
. Достаточно ли одного пробела, чтобы определить, является ли"
конечным знаком или нет (я думаю, что что-то вроде/\w"/
является конечным маркером,/\s"/
- начальным маркером)? - person complex857   schedule 08.04.2013