php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式
php实现读取网易有道词典输出单词的xml格式并且转化为html形式
一、总结
一句话总结:将xml中的文件用preg_match_all读出来,然后组合成想要的数据
1、explode除了爆炸的意思,还有什么意思?
解答:分割、分解、打碎
2、合并一个文档中多行为一行的方法是什么?
解答:替换,把换行符全部替换成空格。$con=str_replace(PHP_EOL,"",$con);
3、PHP正则中的多行匹配修饰符是?
解答:s。多行匹配修饰符s:$pattern="/<".$val.">.*?<\/".$val.">/s";。
4、如何解决file_put_contents函数 failed to open stream: Invalid argument的问题?
解答:把文件名从中文名改成英文名就OK了。
5、如何设置php文件的输出到页面的字符集?
解答:meta标签的charset属性,echo '<meta charset="utf-8"/>';。
6、preg_match_all的两个结果参数分别代表什么?
解答: $out[0]是包含匹配完整模式的字符串的数组, $out[1]是包含闭合标签内的字符串的数组。。
7、php中explode函数的作用是什么?
解答:用一个字符串去分割另外一个。
二、php实现读取网易有道词典的xml格式输出单词并且转化为html形式
正则表达式匹配多行问题:
xml中的trans标签,因为有的是多行的,所以用preg_match_all方法有一些匹配不到
解决策略一:去掉所有换行符
将所有行合并到一行,然后来提取,就没有换行符的影响了,这个时候回出现贪婪匹配的问题,就是比如<word>prompt</word><word>prompt</word><word>prompt</word>,匹配的时候直接匹配的是第一个<word>和最后一个</word>,中间的都被弄进去了,解决方法,优化正则表达式
合并行:$con=str_replace(PHP_EOL,"",$con);
惰性匹配:$pattern="/<".$val.">.*?<\/".$val.">/"; preg_match_all($pattern,$con,$temp);
解决策略二:多行匹配,可以用正则表达式修饰符s
多行匹配修饰符s:$pattern="/<".$val.">.*?<\/".$val.">/s"; preg_match_all($pattern,$con,$temp);
html标签贪婪匹配的问题:
比如<word>prompt</word><word>prompt</word><word>prompt</word>,匹配的时候直接匹配的是第一个<word>和最后一个</word>,中间的都被弄进去了,不同的word没有被区别开来
解决策略一:用惰性匹配就好
惰性匹配:$pattern="/<".$val.">.*?<\/".$val.">/"; preg_match_all($pattern,$con,$temp);
file_put_contents函数 failed to open stream: Invalid argument的问题
解答:把文件名从中文名改成英文名就OK了
1、原数据形式(部分)
<wordbook>
<item>
<word>prompt</word>
<trans><![CDATA[adj. 敏捷的,迅速的;立刻的
vt. 提示;促进;激起;(给演员)提白
n. 提示;付款期限;DOS命令:改变DOS系统提示符的风格
adv. 准时地]]></trans>
<phonetic><![CDATA[[prɒm(p)t]]]></phonetic>
<tags></tags>
<progress>1</progress>
</item>
<item>
<word>expression</word>
<trans><![CDATA[n. 表现,表示,表达;表情,脸色,态度,腔调,声调;式,符号;词句,语句,措辞,说法]]></trans>
<phonetic><![CDATA[[ɪk'sprɛʃən]]]></phonetic>
<tags></tags>
<progress>1</progress>
</item>
</wordbook>
2、最后呈现形式

3、代码
<?php
/**
* Created by PhpStorm.
* User: rfan
* Date: 31/5/2018
* Time: 12:29 PM
*/
echo '<meta charset="utf-8"/>';
$con=file_get_contents('words.xml'); //应该是由于换行符的问题导致的trans匹配不到,那可以把所有的内容匹配成一行就好
$con=str_replace(PHP_EOL,"",$con);
//echo $con; //XML标签配置
$xmlTag=[
'word',
'trans',
'phonetic',
'tags',
'progress'
];
$arr = array();
foreach ($xmlTag as $key=>$val){
//应该是由于换行符的问题导致的trans匹配不到,那可以把所有的内容匹配成一行就好
/***********************************未去掉换行符后的正则表达式***********************************/
// $pattern='/<'.$val.'>'.'.*'.'/<\/'.$val.'>';
// $pattern="/<".$val.">[^<>]*<\/".$val.">/";
// $pattern="/<".$val.">.*\n*.*<\/".$val.">/"; //多行的问题只能匹配139个
// $pattern="/<".$val.">.*?<\/".$val.">/s"; //正确
/***********************************去掉换行符后的正则表达式***********************************/
$pattern="/<".$val.">.*?<\/".$val.">/"; //正确
// echo $pattern.'</br>';
preg_match_all($pattern,$con,$temp);
$arr[] = $temp[0];
// echo '<pre>';
// var_dump($temp);
// echo '</pre>';
} //echo '<pre>';
//var_dump($arr);
//echo '</pre>'; //去除XML标签并组装数据
$data = array();
foreach($arr as $key => $value) {
foreach($value as $k => $v) {
$a = explode($xmlTag[$key].'>', $v);
$v = substr($a[1], 0, strlen($a[1])-2);
$data[$k][$xmlTag[$key]] = $v;
}
} //echo '<pre>';
//var_dump($data);
//echo '</pre>'; //清除数据里面的<![CDATA[]]>
foreach($data as $key=>&$val){
foreach($val as $k => &$v){
// echo $v.'</br>';
$start="/<!\[CDATA\[/";
$end="/\]\]>/";
$v=preg_replace($start,"",$v);
$v=preg_replace($end,"",$v);
// echo $k.': '.$v.'</br>';
}
} //给数据添加好标签,然后按照自己格式输出到文本 //文章题号开始标记
$articleStart=1;
//每篇文章取单词的数目
$selectWordNum=20;
//单词索引号
$iii=1;
foreach($data as $key=>&$val){
if($iii%20==1){ if(isset($articleContent)&&!empty($articleContent)){
echo $articleContent; $fileName='commonWords/'.$pureTitle_en.'.html';
file_put_contents($fileName,$articleContent);
}
$pureTitle_en='commonWords'.$articleStart;
$pureTitle_cn='常用单词'.$articleStart++;
$title='<h1 style="text-align: center;">'.$pureTitle_cn.'</h1>';
$headPart=$title.'<h2>一、总结</h2><p> </p><p> </p><h2>二、'.'测试题-简答题'.'</h2>';
$articleContent=$headPart; }
//每道题目的问题
$pureQuestion=$val['word']." ".$val['phonetic'];
$jj=$iii%20==0?20:$iii%20; //保证每篇文章每道题目的序号都是1-20
$question='<h3>'.$jj.'、'.$pureQuestion.'</h3>';
//每道题目的答案
$pureAnswer=$val['trans'];
$answer='<p>'.$pureAnswer.'</p><p> </p><p> </p>';
//添加每篇文章的内容
$articleContent.=$question.$answer; unset($val['tags']);
unset($val['progress']); $iii++;
} //如果有多的没完的哪一篇,把多的没完的那一篇打下来
if(isset($articleContent)&&!empty($articleContent)){
echo $articleContent; $fileName='commonWords/'.$pureTitle_en.'.html';
file_put_contents($fileName,$articleContent);
} //$str="dfafeasfasefase";
//$start="/^dfa/";
//$end="/ase$/";
//echo $str.'</br>';
//$str=preg_replace($start,"",$str);
//echo $str.'</br>';
//$str=preg_replace($end,"",$str);
//echo $str.'</br>'; //echo '<pre>';
//var_dump($data);
//echo '</pre>'; //按照自己格式输出到文本
//$file='wordsOk.text';
//file_put_contents($filet,$data);
三、附加
1、preg_match_all 使用实例
<?php
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
?>
以上例程会输出: <b>example: </b>, <div align=left>this is a test</div>
example: , this is a test
因此, $out[0]是包含匹配完整模式的字符串的数组, $out[1]是包含闭合标签内的字符串的数组。
四、测试题-简答题
1、explode除了爆炸的意思,还有什么意思?
解答:分割、分解、打碎
2、合并一个文档中多行为一行的方法是什么?
解答:替换,把换行符全部替换成空格。$con=str_replace(PHP_EOL,"",$con);
3、PHP正则中的多行匹配修饰符是?
解答:s。多行匹配修饰符s:$pattern="/<".$val.">.*?<\/".$val.">/s";。
4、如何解决file_put_contents函数 failed to open stream: Invalid argument的问题?
解答:把文件名从中文名改成英文名就OK了。
5、如何设置php文件的输出到页面的字符集?
解答:meta标签的charset属性,echo '<meta charset="utf-8"/>';。
6、preg_match_all的两个结果参数分别代表什么?
解答: $out[0]是包含匹配完整模式的字符串的数组, $out[1]是包含闭合标签内的字符串的数组。。
7、php中explode函数的作用是什么?
解答:用一个字符串去分割另外一个。
php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式的更多相关文章
- 调用网易有道词典api
# -*- coding: utf-8 -*- #python 27 #xiaodeng #调用网易有道词典api import urllib import json class Youdao(): ...
- 我在用的翻译软件 -> 微软翻译+网易有道词典+谷歌翻译
Windows网页翻译 因为微软翻译相对来说翻译网页更为准确,我也喜欢用谷歌的Chrome浏览器,但是我没找到微软翻译的扩展,这里只能放弃 这个需要配合Microsoft Edge浏览器进行使用,也是 ...
- php 生成bing词典能导入的xml(有道词典->bing词典)
编程以来一直用网易有道词典查单词.翻译:最近一直在看英文方面的资料,于是越来越对有道词典(划词.广告,本来想转灵格斯的,但灵格斯没有android版)不满意,一番试用后决定转bing词典,于是想把有道 ...
- Python下载一张图片与有道词典
1.下载一张图片代码1 import urllib.request response = urllib.request.urlopen('http://photocdn.sohu.com/201009 ...
- 【应用】_有道词典客户端一个后缀名为sql的数据库。
[缘起] 在清理电脑磁盘的时候,看一看各安装文件夹有占用了多大容量,发现有道词典居然达140MB了,于是进去看看. 发现个有趣的文件:XXX.sql. 首先我们看一看它的安装文件夹的结构: Dict ...
- Mac上的欧路词典单词本迁移到有道词典 #node.js
摘要 有道词典提供了柯林斯和朗文辞典,加上最近在背单词且Mac版的屏幕取词也够用了,为了云单词本的同步,决定抛弃Mac上的欧路词典.单词欧路上的单词本也存了一百多个单词.怎样迁移到有道呢? 关键词:n ...
- Teamwork-Week2真对必应词典和有道词典的软件分析和用户需求调查(桌面版)
经调查,现在有道词典在该领域拥有很大程度的市场占有率,所以我们将有道词典与必应词典进行对比. 核心功能一:单词本 有道词典中的单词本都只能是由用户手动添加不会的单词,而必应词典中的单词 不仅可以被自己 ...
- ubuntu16.04安装不上有道词典的解决办法
转自:http://www.linuxdiyf.com/linux/21143.html ubuntu16.04安装不上有道词典,提示: le@hu-pc:~/下载$ sudo dpkg -i you ...
- 有道词典 安卓版 更新日志 - imsoft.cnblogs
手机词典 更新日志: 2014年4月23日 v5.0.4版本 · 新增“全球发音”功能,带来世界各国的英文口音,体验原汁原味的英语发音: · 新增“发现频道”,打造移动 ...
随机推荐
- System.out.println 的多线程并发问题
假设println函数的參数为常量则不会出现线程并发问题,可是假设參数为表达式形式.则JVM在运行println函数的时候会分为几步来运行,从而造成并发问题. 例如以下样例所看到的: package ...
- Rotation--控件位置旋转
今天想要完成一个按钮的动画,也就是随着手势在屏幕上的滑动,让按钮图片跟着旋转.刚开始的思路是,先把图片旋转以后,在把这个图片设置为imagebutton的背景.不过,会发现这个图片经过处理以后一直变形 ...
- 10.Maven依赖排除 禁止依赖传递 取消依赖的方法
转自:https://www.cnblogs.com/duanxz/p/6084494.html 大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触.最近要开发一个java ...
- Flume Source官网剖析(博主推荐)
不多说,直接上干货! 一切来源于flume官网 http://flume.apache.org/FlumeUserGuide.html Flume Sources Avro Source Thrift ...
- 逆波兰法(计算器)程序<无括号版>
涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 && hdu 6154】CaoHaha's staff
[链接]点击打开链接 [题意] 给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线. [题解] 找规律题 考虑s[i]表示i条边 ...
- maven插件介绍之tomcat7-maven-plugin
tomcat7-maven-plugin插件的pom.xml依赖为: <dependency> <groupId>org.apache.tomcat.maven</gro ...
- 【几何/数学】概念的理解 —— (非)刚体变换((non-)rigid transformation)
1. 刚体变换与非刚体变换 What is a non-rigid transformation? 刚体变换(rigid transformation)一般分为如下几种: 平移对象,而不改变形状和大小 ...
- 3D游戏《龙心传奇Dragona》全套完整源码
<龙心传奇Dragona>全套完整源码,<Dragona Online>也叫<龙心传奇>是一款3D中古奇幻风格网络游戏,描写叙述一个充满剑.魔法.恶魔和龙的魔法大陆 ...
- poj1679 The Unique MST(判定次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23180 Accepted: 8235 D ...