Regex заменяет пару знаков доллара

Я объединил разметку MathJax и Markdown, поэтому мне нужно заменить все $$ на <span>$$</span>, чтобы Markdown не отображал знаки $$_^... из MathJax. Также все \[ \] необходимо заменить на <div>\[ \]</div>.

Я нашел похожий вопрос, но это не совсем то, что мне нужно. мне нужно преобразовать это

This is $some$ math \[equation\] which I $like$.

к этому

This is <span>$some$</span> math <div>\[equation\]</div> which I <span>$like$</span>.

Вероятно, мне нужно только регулярное выражение

text = text.replace(/\$.*?\$/g, "meow");

как-то включать и $$ знаки (или \[ \]) и просто с $1 вставлять текст внутрь <span>$$1$</span> и адаптировать под PHP.


person svenkapudija    schedule 25.06.2012    source источник


Ответы (1)


Вам нужно сделать это в два шага, потому что тексты замены разные.

Сначала замените $..$:

$text = preg_replace('/\$.*?\$/', '<span>\0</span>', $text);

Затем замените \[...\]:

$text = preg_replace('/\\\\\[.*?\\\\\]/', '<div>\0</div>', $text);
person Tim Pietzcker    schedule 25.06.2012
comment
Второй также кэширует двойную обратную косую черту в качестве замены, и из Test \\ Blah я получаю Test <div>\\</div> Blah. Также я использую эквиваленты PHP /(\$.*?\$)/, "<span>$1</span>" и /(\\\[.*?\\\])/, "<div>$1</div>". - person svenkapudija; 25.06.2012
comment
@svenkapudija: я не слежу. Вы используете их в JavaScript, верно? Второй не должен захватывать \\, потому что \[ является обязательным. - person Tim Pietzcker; 25.06.2012
comment
PHP на самом деле, моя вина, теперь я добавил тег к вопросу. Я удалил escape-последовательности javascript, и он не отмечает двойную обратную косую черту, но ни знаки \[ \] - /(\[.*?\])/ - person svenkapudija; 25.06.2012
comment
@svenkapudija: Хорошо, в этом случае вам нужно изменить регулярное выражение, потому что PHP требуется четыре обратных слэша в регулярном выражении, чтобы соответствовать одному буквальному обратному слэшу. (И используйте \0 вместо $&.) См. мое редактирование. - person Tim Pietzcker; 25.06.2012
comment
Понятно! Также нужен модификатор /s в конце для нескольких строк (пропустил этот). Спасибо. - person svenkapudija; 25.06.2012
comment
Мне нужно одно дополнительное требование, оно должно выполнять эту замену, но только если символ перед $ не является `\` (обратная косая черта). Таким образом, $test$ следует заменить, но не \$test\$. - person svenkapudija; 08.07.2012
comment
@svenkapudija: я подозреваю, что проблема сложнее - вам нужно проверить нечетное количество обратных косых черт. - person Tim Pietzcker; 08.07.2012
comment
Да, вы правы, но пока это базовое решение будет работать нормально. - person svenkapudija; 08.07.2012