微信扫一扫打赏支持

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、代码

  1 <?php
  2 /**
  3  * Created by PhpStorm.
  4  * User: rfan
  5  * Date: 31/5/2018
  6  * Time: 12:29 PM
  7  */
  8 echo '<meta charset="utf-8"/>';
  9 $con=file_get_contents('words.xml');
 10 
 11 //应该是由于换行符的问题导致的trans匹配不到,那可以把所有的内容匹配成一行就好
 12 $con=str_replace(PHP_EOL,"",$con);
 13 //echo $con;
 14 
 15 
 16 //XML标签配置
 17 $xmlTag=[
 18     'word',
 19     'trans',
 20     'phonetic',
 21     'tags',
 22     'progress'
 23 ];
 24 $arr = array();
 25 foreach ($xmlTag as $key=>$val){
 26     //应该是由于换行符的问题导致的trans匹配不到,那可以把所有的内容匹配成一行就好
 27     /***********************************未去掉换行符后的正则表达式***********************************/
 28 //    $pattern='/<'.$val.'>'.'.*'.'/<\/'.$val.'>';
 29 //    $pattern="/<".$val.">[^<>]*<\/".$val.">/";
 30 //    $pattern="/<".$val.">.*\n*.*<\/".$val.">/"; //多行的问题只能匹配139个
 31 //    $pattern="/<".$val.">.*?<\/".$val.">/s"; //正确
 32     /***********************************去掉换行符后的正则表达式***********************************/
 33     $pattern="/<".$val.">.*?<\/".$val.">/"; //正确
 34 //    echo $pattern.'</br>';
 35     preg_match_all($pattern,$con,$temp);
 36     $arr[] = $temp[0];
 37 //    echo '<pre>';
 38 //    var_dump($temp);
 39 //    echo '</pre>';
 40 }
 41 
 42 //echo '<pre>';
 43 //var_dump($arr);
 44 //echo '</pre>';
 45 
 46 //去除XML标签并组装数据
 47 $data = array();
 48 foreach($arr as $key => $value) {
 49     foreach($value as $k => $v) {
 50         $a = explode($xmlTag[$key].'>', $v);
 51         $v = substr($a[1], 0, strlen($a[1])-2);
 52         $data[$k][$xmlTag[$key]] = $v;
 53     }
 54 }
 55 
 56 //echo '<pre>';
 57 //var_dump($data);
 58 //echo '</pre>';
 59 
 60 
 61 //清除数据里面的<![CDATA[]]>
 62 foreach($data as $key=>&$val){
 63     foreach($val as $k => &$v){
 64 //        echo $v.'</br>';
 65         $start="/<!\[CDATA\[/";
 66         $end="/\]\]>/";
 67         $v=preg_replace($start,"",$v);
 68         $v=preg_replace($end,"",$v);
 69 //        echo $k.':&nbsp;&nbsp;'.$v.'</br>';
 70     }
 71 }
 72 
 73 
 74 //给数据添加好标签,然后按照自己格式输出到文本
 75 
 76 //文章题号开始标记
 77 $articleStart=1;
 78 //每篇文章取单词的数目
 79 $selectWordNum=20;
 80 //单词索引号
 81 $iii=1;
 82 foreach($data as $key=>&$val){
 83     if($iii%20==1){
 84 
 85         if(isset($articleContent)&&!empty($articleContent)){
 86             echo $articleContent;
 87 
 88             $fileName='commonWords/'.$pureTitle_en.'.html';
 89             file_put_contents($fileName,$articleContent);
 90         }
 91         $pureTitle_en='commonWords'.$articleStart;
 92         $pureTitle_cn='常用单词'.$articleStart++;
 93         $title='<h1 style="text-align: center;">'.$pureTitle_cn.'</h1>';
 94         $headPart=$title.'<h2>一、总结</h2><p>&nbsp;</p><p>&nbsp;</p><h2>二、'.'测试题-简答题'.'</h2>';
 95         $articleContent=$headPart;
 96 
 97 
 98 
 99     }
100     //每道题目的问题
101     $pureQuestion=$val['word']."&nbsp;&nbsp;".$val['phonetic'];
102     $jj=$iii%20==0?20:$iii%20; //保证每篇文章每道题目的序号都是1-20
103     $question='<h3>'.$jj.'、'.$pureQuestion.'</h3>';
104     //每道题目的答案
105     $pureAnswer=$val['trans'];
106     $answer='<p>'.$pureAnswer.'</p><p>&nbsp;</p><p>&nbsp;</p>';
107     //添加每篇文章的内容
108     $articleContent.=$question.$answer;
109 
110     unset($val['tags']);
111     unset($val['progress']);
112 
113     $iii++;
114 }
115 
116 //如果有多的没完的哪一篇,把多的没完的那一篇打下来
117 if(isset($articleContent)&&!empty($articleContent)){
118     echo $articleContent;
119 
120     $fileName='commonWords/'.$pureTitle_en.'.html';
121     file_put_contents($fileName,$articleContent);
122 }
123 
124 
125 
126 //$str="dfafeasfasefase";
127 //$start="/^dfa/";
128 //$end="/ase$/";
129 //echo $str.'</br>';
130 //$str=preg_replace($start,"",$str);
131 //echo $str.'</br>';
132 //$str=preg_replace($end,"",$str);
133 //echo $str.'</br>';
134 
135 //echo '<pre>';
136 //var_dump($data);
137 //echo '</pre>';
138 
139 //按照自己格式输出到文本
140 //$file='wordsOk.text';
141 //file_put_contents($filet,$data);

 

三、附加

1、preg_match_all 使用实例

 1 <?php
 2 preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
 3     "<b>example: </b><div align=left>this is a test</div>",
 4     $out, PREG_PATTERN_ORDER);
 5 echo $out[0][0] . ", " . $out[0][1] . "\n";
 6 echo $out[1][0] . ", " . $out[1][1] . "\n";
 7 ?>
 8 以上例程会输出:
 9 
10 <b>example: </b>, <div align=left>this is a test</div>
11 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函数的作用是什么?

解答:用一个字符串去分割另外一个。

 

 

 

 

 

 

 

 

 

 

 
posted @ 2018-06-04 16:47  范仁义  阅读(712)  评论(0编辑  收藏  举报