@kotey

Как сделать замену кавычек на «елочки» через регулярку?

Доброго времени суток, уважаемые!
Возникла необходимость сделать при обработке текста замену прямых скобок (") на красивые елочки («ёлочки» ).
То есть, имеется текст:
"Он сказал, - поехали"
"Он сказал поехали!"
"Он сказал - поехали?"
"Он сказал поехали?!"
"Он сказал поехали..."
"Он сказал "поехали"

где надо всё поменять на
«Он сказал, — поехали»
«Он сказал поехали!»
«Он сказал — поехали?»
«Он сказал поехали?!»
«Он сказал поехали...»
«Он сказал «поехали»


Так как сам я нуб нубом, то полез искать, как это делается умными людьми.
Нашел вполне рабочую регулярку:
$datatext = preg_replace('#"(.*?)"#', '«$1»', $datatext);
Она работает, всё хорошо, но!
Вот в этом случае (когда внутри кавычек присутствует ещё одна):
"Он сказал "поехали"
результат получается:
«Он сказал »поехали"
Что неприемлимо, увы.
Но мы же, нубочайники, не привыкли отступать!
После применения альтернативного мЫшления было решено разбить задачу на составляющие. То есть, сделать две регулярки. Первая заменяет кавычку в начале слова, а потом, уже вторая, в конце слова.
$datatext=preg_replace('/\B\"\b/','«',$datatext); // в начале
$datatext = preg_replace('/\b(.*?)"/', '$1»', $datatext); // в конце

Что самое удивительное, эта вот конструкция работает! Но вставлять её в сайт страшно. Поскольку я слабо понимаю как она работает (особенно второе выражение), и чем это может грозить.
Поэтому огромная просьба к опытным людям, дать оценку этому художеству на предмет безопасности/производительности.
Вроде: "Написано левой ногой через правое ухо, но в принципе ничего опасного, вставляй на свой сайтик и не надоедай больше"
Или же: "Нубас, если ты вот это убожество вставишь (неважно куда) базы рухнут, сервер повиснет и к тебе хостеры с бейсбольными битами прибегут! Так что, сотри немедленно и больше никому не показывай!"
Заранее благодарю за ответ.
  • Вопрос задан
  • 5028 просмотров
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Вот этот - наиболее производительный и гибкий код, чем тот, что написан у Вас:
$datatext=<<<t
"Он сказал, - поехали"
"Он сказал поехали!"
"Он сказал - поехали?"
"Он сказал поехали?!"
"Он сказал поехали..."
"Он сказал "поехали"
<b>"Он сказал, — поехали"</b>
"Ж"
"Ж" "полная"
"7" "444 "888"
""
t;

$datatext=preg_replace_callback(
        '#(([\"]{2,})|(?![^\W])(\"))|([^\s][\"]+(?![\w]))#u',
        function ($matches) {
            if (count($matches)===3) return "«»";
            else if ($matches[1]) return str_replace('"',"«",$matches[1]);
            else return str_replace('"',"»",$matches[4]);
        },
        $datatext
    );

echo "<pre>".$datatext."</pre>";

/*
«Он сказал, - поехали»
«Он сказал поехали!»
«Он сказал - поехали?»
«Он сказал поехали?!»
«Он сказал поехали...»
«Он сказал «поехали»
«Он сказал, — поехали»
«Ж»
«Ж» «полная»
«7» «444 «888»
«»
*/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Atllantis
Как вариант: "(.*?)\S"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы