как избежать специальных латексных символов вне математического режима в строке PHP

предполагать

$string  = " we will study integers & functions & matrices such as $$\begin{tabular}{ccc}  a     & b & c \\  a     & b & c \\   \end{tabular}$$ ";

Я хотел бы избежать специальных латексных символов (таких как ‘&’) вне математического режима, оставив все математические вещи в покое, поэтому желаемый результат будет:

$string  = " we will study integers \& functions \& matrices such as $$\begin{tabular}{ccc}  a     & b & c \\  a     & b & c \\   \end{tabular}$$ ";

Если бы кто-то мог вести меня в правильном направлении, я был бы очень благодарен. Спасибо

1

Решение

Что-то вроде этого:

$text = ' we will study integers & functions & matrices such as $$\begin{tabular}{ccc}  a     & b & c \\  a     & b & c \\   \end{tabular}$$ ';

$pattern = <<<'EOD'
~
[$&%#_{}^\\%]
(?:
(?<=\$)
(?:
\$ [^$]*+ (?:\$(?!\$)[^$]*)*+ \$\$ # display math mode (unofficial syntax)
|
[^$]+ \$ # ordinary math mode
) (*SKIP)(*F)
|
(?<=\\)
(?:
\[ [^\\]*+ (?>\\(?!])[^\\]*)*+ \\] # display math mode (square brackets)
|
\( [^\\]*+ (?>\\(?!\))[^\\]*)*+ \\ \) # ordinary math mode (parenthesis)
|
begin{(verbatim|math|displaymath|equation)} .*? \\end{\g{-1}}
|
verb\*?(.).*?\g{-1} | [\\@ ]
|
[a-z]+ (?:\[ [^]]* ] | {([^{}]*(?:{(?-1)}[^{}]*)*+)} | \( [^)]* \) | \s+ )* # latex keyword
)
(*SKIP)(*F)
|
(?<=%) \N* # comments
(*SKIP)(*F)
)?
~xs
EOD;

$text = preg_replace_callback($pattern, function ($m) {
return ($m[0] == '\\') ? '\\textbackslash{}' : '\\' . $m[0]; }, $text);

В паттерне используется комбинация контрольных глаголов (*SKIP)(*F), Когда механизм возврата происходит и встречает (*SKIP) токен, механизм регулярных выражений останавливает ход возврата и повторяет весь паттерн в текущей позиции в целевой строке (в (*SKIP) положение), поэтому все символы совпадают до (*SKIP) токены игнорируются и не повторяются. (*F) (или же (*FAIL)) принудительно завершает работу шаблона, запускающего механизм возврата.

Обратите внимание, что строка должна быть заключена в одинарные кавычки, если вы не хотите, чтобы PHP интерпретировал все обратные слэши как escape-последовательности.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]