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

1

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

$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}$$ ";

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

Теги:
preg-match
latex
preg-replace

1 ответ

2
Лучший ответ

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

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

  • 0
    ты великолепен! спасибо, это сработало прекрасно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню