Я перепроектирую математическую программу для студентов. Оригинальная программа была написана в Adobe Flash. На этот раз я делаю это в PHP и JavaScript.
В исходной программе есть несколько файлов XML с сотнями математических вопросов, а некоторые из них - фракции. Эти фракции записываются как: # (1,4). Я хочу сделать функцию под названием #
которая может делать классические фракции.
Проблема: есть обычный текст вокруг # (1,3), и он не разделяется кавычками. Как я могу сообщить браузеру, что в тексте есть функция? Пример:
<question>what is #(2,8) divided by #(3,4)</question>
Надеюсь, вы знаете, как это сделать. Благодарю.
Без более подробной информации:
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) будет выглядеть намного приятнее.
Как вы указали... уже есть ссылка, которая частично обрабатывает вашу проблему.
Как отображать "классические" застроенные фракции с горизонтальной линией в 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 и принятого ответа :)
Регулярное выражение!
^#\([\d]+,[\d]+\)$
Это будет соответствовать всем, что начинается/заканчивается на #([*number(s)*],[*number(s)*])
Вы можете заставить PHP сделать это и форматировать, тем не менее, вам это нужно.
Вы можете разобрать текст на PHP, используя preg_replace()
. Вот пример того, как он может работать:
preg_replace( "/#\((\d+),(\d+)\)/" , "$1/$2" , $question );
Вы хотите написать цикл, чтобы получить каждый вопрос из xml и запустить на нем эту строку кода.
Это займет следующую строку:
что равно # (2,8), деленное на # (3,4)
И дайте вам следующее:
что 2/8 разделено на 3/4
Вы можете возиться с этим кодом и посмотреть, как он работает в PHP-песочнице.