问卷星文本导入问题实现

        使用js正则表达式实现类似问卷星文本导入问题。这里只是实现最基础的解析,没有考虑异常情况的处理。

文本内容

		<textarea id="txt">
			1、我国的火警报警电话是(C)?[单选题](分值:5分)
			A、110
			B、120
			C、119
			D、911
			
			2、四大文明古国中的,四大文明是下列选项中的哪四个(ABCE)?[多选题](分值:10分)
			A、埃及文明
			B、印度文明
			C、中国文明
			D、希腊文明
			E、美索不达米亚文明
			
			3、《出师表》中,“先帝創業未半,而中道崩殂“中的”先帝“是指刘备。(对)[判断题](分值:5分)
			
			4、《史记》的作者是?[填空题]
		</textarea>

将文本解析为question对象

/**
		 * 文本切割成问题块
		 */
		function getBlocks() {
			const text = document.getElementById('txt').innerHTML
			const paragraphs = text.split(/\n\s*\n/);
			return paragraphs
		}

		/**
		 * @param {Object} txt 内容转换成question对象
		 */
		function getQuestion(txt) {
			const question = {
				selections: []
			}
			const lines = txt.split(/\r?\n/);
			for (let idx in lines) {
				const line = lines[idx].replace(/\s/g, '')

				if (idx == 0) {
					question.type = getQuestionType(line)
					question.title = getTitle(line)
					question.answer = getAnswer(line)
					question.score = getScore(line)
				} else if (line) {
					question.selections.push(line)
				}
			}
			// console.log(question)
			return question
		}

		/**
		 * 提取问题类型
		 * @param {Object} text
		 */
		function getQuestionType(text) {
			const regex = /\[(.*?)\]/g;
			const matches = text.match(regex);
			return matches ? matches[0]?.replace(/\s/g, '').replace(/\[|\]/g, '') : ''
		}

		/**
		 * 提取题目
		 * @param {Object} text
		 */
		function getTitle(text) {
			const type = /\[(.*?)\]/g;
			const answer = /\((.*?)\)|((.*?))/g;
			const title = text.replace(type, '').replace(answer, '');
			return title
		}

		/**
		 * 提取答案
		 * @param {Object} text
		 */
		function getAnswer(text) {
			const regex = /\(([^分].*?)\)|(([^分].*?))/g;
			let matches = text.match(regex);
			return matches ? matches[0]?.replace(/\s/g, '').replace(/\(|\)/g, '').replace(/(|)/g, '') : ''
		}

		/**
		 * 提取分值
		 * @param {Object} text
		 */
		function getScore(text) {
			const regex = /\((分值:.*?)\)|((分值:.*?))/g;
			let matches = text.match(regex)
			const scores = matches ? matches[0]?.match(/[0-9]+/g) : null
			return scores ? scores[0] : ''
		}


		const paragraphs = getBlocks()
		const questions = []
		for (let idx in paragraphs) {
			const txt = paragraphs[idx]
			const q = getQuestion(txt)
			questions.push(q)
		}
		console.log(questions)

执行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值