предполагать
$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-последовательности.