предполагать
$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}$$ ";
Если бы кто-то мог вести меня в правильном направлении, я был бы очень благодарен. Спасибо
Что-то вроде этого:
$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-последовательности.
Других решений пока нет …