Подскажите, пожалуйста, как правильно составить регулярное выражение

Рейтинг: 0Ответов: 1Опубликовано: 12.08.2023

Всем добрый день! Пытался регулярными выражениями решить проблему с отображением формул, теперь есть две проблемы :) Суть вопроса: когда после формулы в mathjax следует запятая, точка, точка с запятой или иной знак препинания, то такой знак нередко переносится на новую строку, что смотрится отвратительно. Чтобы избежать этого, нужно заключить формулу и следующий за нею знак препинания в <span> типа такого: <span>\( тут код формулы \),<span>. Здесь знаки \( и \) обрамляют формулу для последующего рендеринга mathjax.

Я попробовал решить эту проблему (для начала - хотя бы с точкой после формулы) перед выдачей страницы пользователю следующим образом - найти все вхождения структуры <math>формула</math>. в полученном из базы данных тексте параграфа и преобразовать в <span>\( формула \).<span>:

$text = 'Тут формула с точкой: <math>f1</math>. А тут с запятой: <math>f2</math>, а тут опять с точкой: <math>f3</math>. Эта с запятой: <math>f3</math>, далее просто текст ';

$text = preg_replace('|<math>(.*)(<\/math>\.)|Uis', '<span>\( $1 \).</span>', $text);

Результат, к сожалению, был удручающим:

Тут формула с точкой: <span>\( f1 \).</span> А тут с запятой: <span>\( f2</math>, а тут опять с точкой: <math>f3 \).</span> Эта с запятой: <math>f3</math>, далее просто текст 

Первое вхождение было заменено, а далее - регулярное выражение захватило слишком большой кусок. Подскажите, пожалуйста, как можно сделать так, чтобы если после куска <math>text</math> не было знака препинания, программа просто переходила бы к следующему куску?

Ответы

▲ 0Принят

По-моему, тут дело в захвате точки или запятой после </math>. Попробуйте такие выражения для поиска и замены:

$text = 'Тут формула с точкой: <math>f1</math>. А тут с запятой: <math>f2</math>, а тут опять с точкой: <math>f3</math>. Эта с запятой: <math>f3</math>, далее просто текст ';
$text = preg_replace('/<math>(.*)<\/math>(\.|,)/Uis', '<span>\( $1 \)$2</span>', $text);
echo $text;

Вывод:

Тут формула с точкой: <span>\( f1 \).</span> А тут с запятой: <span>\( f2 \),</span> а тут опять с точкой: <span>\( f3 \).</span> Эта с запятой: <span>\( f3 \),</span> далее просто текст 

В первую группу захвата помещаем формулу между тегами math, а во вторую - найденную точку или запятую после тэга math. При замене первую группу оборачиваем в скобки, после скобок вставляем найденную точку или запятую из второй группы захвата.

Демо