Найти функцию в тексте

0

Я перепроектирую математическую программу для студентов. Оригинальная программа была написана в Adobe Flash. На этот раз я делаю это в PHP и JavaScript.

В исходной программе есть несколько файлов XML с сотнями математических вопросов, а некоторые из них - фракции. Эти фракции записываются как: # (1,4). Я хочу сделать функцию под названием # которая может делать классические фракции.

Проблема: есть обычный текст вокруг # (1,3), и он не разделяется кавычками. Как я могу сообщить браузеру, что в тексте есть функция? Пример:

  <question>what is #(2,8) divided by #(3,4)</question>

Надеюсь, вы знаете, как это сделать. Благодарю.

4 ответа

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

Без более подробной информации:

var s = "<question>what is #(2,8) divided by #(3,4)</question>";
var t = s.replace(/(^|\s|>)#\((\d+),(\d+)\)($|\s|<)/g, "$1<span class='fraction'><span class='numerator'>$2</span><span class='denominator'>$3</span></span>$4");

t теперь

"<question>what is <span class='fraction'><span class='numerator'>2</span><span class='denominator'>8</span></span> divided by <span class='fraction'><span class='numerator'>3</span><span class='denominator'>4</span></span></question>"

Итак: регулярное выражение, в котором вы находите # (...,...), где ... - числа, а строки "функции" либо окружены пробелом, началом/концом предложения, либо угловыми скобками.

Однако переписывание его в MathJax MathML или в формате LaTeX (http://mathjax.org) будет выглядеть намного приятнее.

  • 0
    Спасибо за вашу помощь!
  • 0
    и обновил, потому что я забыл положить биты «вокруг функции» обратно в замену.
0

Как вы указали... уже есть ссылка, которая частично обрабатывает вашу проблему.

Как отображать "классические" застроенные фракции с горизонтальной линией в CSS/JavaScript?

Я работал над jsfiddle ссылки, чтобы удовлетворить ваши потребности:

http://jsfiddle.net/xW7d8/156/

Единственное изменение находится в javascript, меняя ваш # (1,2) на 1/2. И тогда существующий скрипт выполняет эту работу.

$('.fraction').each(function(key, value) {
    $this = $(this) ;
    var s = $this.text() ;
    var n = s.replace(/#\((\d+),(\d+)\)/g, "$1/$2") ;
    var split = n.split("/")
    if( split.length == 2 ){
        $this.html('<span class="top">'+split[0]+'</span><span class="bottom">'+split[1]+'</span>')
    }    
});

- Изменить - не учитывает изменение от <question> String </question> до <span...> String </span>. Вы можете использовать комбинацию jsfiddle и принятого ответа :)

0

Регулярное выражение!

^#\([\d]+,[\d]+\)$

Это будет соответствовать всем, что начинается/заканчивается на #([*number(s)*],[*number(s)*])

Вы можете заставить PHP сделать это и форматировать, тем не менее, вам это нужно.

  • 0
    Спасибо за вашу помощь!
  • 0
    Это будет соответствовать шаблону правильно, но только если это единственная вещь на линии.
0

Вы можете разобрать текст на PHP, используя preg_replace(). Вот пример того, как он может работать:

preg_replace( "/#\((\d+),(\d+)\)/" , "$1/$2" , $question );

Вы хотите написать цикл, чтобы получить каждый вопрос из xml и запустить на нем эту строку кода.

Это займет следующую строку:

что равно # (2,8), деленное на # (3,4)

И дайте вам следующее:

что 2/8 разделено на 3/4

Вы можете возиться с этим кодом и посмотреть, как он работает в PHP-песочнице.

  • 0
    Спасибо за вашу помощь!

Ещё вопросы

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