php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式
php實(shí)現(xiàn)讀取網(wǎng)易有道詞典輸出單詞的xml格式并且轉(zhuǎn)化為html形式
一、總結(jié)
一句話總結(jié):將xml中的文件用preg_match_all讀出來,然后組合成想要的數(shù)據(jù)
?
1、explode除了爆炸的意思,還有什么意思?
解答:分割、分解、打碎
2、合并一個(gè)文檔中多行為一行的方法是什么?
解答:替換,把換行符全部替換成空格。$con=str_replace(PHP_EOL,"",$con);
3、PHP正則中的多行匹配修飾符是?
解答:s。多行匹配修飾符s:$pattern="/<".$val.">.*?<\/".$val.">/s";。
4、如何解決file_put_contents函數(shù)?failed to open stream: Invalid argument的問題?
解答:把文件名從中文名改成英文名就OK了。
5、如何設(shè)置php文件的輸出到頁面的字符集?
解答:meta標(biāo)簽的charset屬性,echo '<meta charset="utf-8"/>';。
6、preg_match_all的兩個(gè)結(jié)果參數(shù)分別代表什么?
解答:?$out[0]是包含匹配完整模式的字符串的數(shù)組,?$out[1]是包含閉合標(biāo)簽內(nèi)的字符串的數(shù)組。。
7、php中explode函數(shù)的作用是什么?
解答:用一個(gè)字符串去分割另外一個(gè)。
?
?
?
二、php實(shí)現(xiàn)讀取網(wǎng)易有道詞典的xml格式輸出單詞并且轉(zhuǎn)化為html形式
正則表達(dá)式匹配多行問題:
xml中的trans標(biāo)簽,因?yàn)橛械氖嵌嘈械?#xff0c;所以用preg_match_all方法有一些匹配不到
解決策略一:去掉所有換行符
將所有行合并到一行,然后來提取,就沒有換行符的影響了,這個(gè)時(shí)候回出現(xiàn)貪婪匹配的問題,就是比如<word>prompt</word><word>prompt</word><word>prompt</word>,匹配的時(shí)候直接匹配的是第一個(gè)<word>和最后一個(gè)</word>,中間的都被弄進(jìn)去了,解決方法,優(yōu)化正則表達(dá)式
合并行:$con=str_replace(PHP_EOL,"",$con);
惰性匹配:$pattern="/<".$val.">.*?<\/".$val.">/";??preg_match_all($pattern,$con,$temp);
?
解決策略二:多行匹配,可以用正則表達(dá)式修飾符s
多行匹配修飾符s:$pattern="/<".$val.">.*?<\/".$val.">/s";??preg_match_all($pattern,$con,$temp);
?
html標(biāo)簽貪婪匹配的問題:
比如<word>prompt</word><word>prompt</word><word>prompt</word>,匹配的時(shí)候直接匹配的是第一個(gè)<word>和最后一個(gè)</word>,中間的都被弄進(jìn)去了,不同的word沒有被區(qū)別開來
解決策略一:用惰性匹配就好
惰性匹配:$pattern="/<".$val.">.*?<\/".$val.">/";??preg_match_all($pattern,$con,$temp);
?
file_put_contents函數(shù)?failed to open stream: Invalid argument的問題
解答:把文件名從中文名改成英文名就OK了
?
1、原數(shù)據(jù)形式(部分)
<wordbook><item><word>prompt</word><trans><![CDATA[adj. 敏捷的,迅速的;立刻的 vt. 提示;促進(jìn);激起;(給演員)提白 n. 提示;付款期限;DOS命令:改變DOS系統(tǒng)提示符的風(fēng)格 adv. 準(zhǔn)時(shí)地]]></trans><phonetic><![CDATA[[pr?m(p)t]]]></phonetic><tags></tags><progress>1</progress></item><item><word>expression</word><trans><![CDATA[n. 表現(xiàn),表示,表達(dá);表情,臉色,態(tài)度,腔調(diào),聲調(diào);式,符號;詞句,語句,措辭,說法]]></trans><phonetic><![CDATA[[?k'spr???n]]]></phonetic><tags></tags><progress>1</progress></item> </wordbook>?
2、最后呈現(xiàn)形式
?
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 //應(yīng)該是由于換行符的問題導(dǎo)致的trans匹配不到,那可以把所有的內(nèi)容匹配成一行就好 12 $con=str_replace(PHP_EOL,"",$con); 13 //echo $con; 14 15 16 //XML標(biāo)簽配置 17 $xmlTag=[ 18 'word', 19 'trans', 20 'phonetic', 21 'tags', 22 'progress' 23 ]; 24 $arr = array(); 25 foreach ($xmlTag as $key=>$val){ 26 //應(yīng)該是由于換行符的問題導(dǎo)致的trans匹配不到,那可以把所有的內(nèi)容匹配成一行就好 27 /***********************************未去掉換行符后的正則表達(dá)式***********************************/ 28 // $pattern='/<'.$val.'>'.'.*'.'/<\/'.$val.'>'; 29 // $pattern="/<".$val.">[^<>]*<\/".$val.">/"; 30 // $pattern="/<".$val.">.*\n*.*<\/".$val.">/"; //多行的問題只能匹配139個(gè) 31 // $pattern="/<".$val.">.*?<\/".$val.">/s"; //正確 32 /***********************************去掉換行符后的正則表達(dá)式***********************************/ 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標(biāo)簽并組裝數(shù)據(jù) 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 //清除數(shù)據(jù)里面的<![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.': '.$v.'</br>'; 70 } 71 } 72 73 74 //給數(shù)據(jù)添加好標(biāo)簽,然后按照自己格式輸出到文本 75 76 //文章題號開始標(biāo)記 77 $articleStart=1; 78 //每篇文章取單詞的數(shù)目 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>一、總結(jié)</h2><p> </p><p> </p><h2>二、'.'測試題-簡答題'.'</h2>'; 95 $articleContent=$headPart; 96 97 98 99 } 100 //每道題目的問題 101 $pureQuestion=$val['word']." ".$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> </p><p> </p>'; 107 //添加每篇文章的內(nèi)容 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 使用實(shí)例
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]是包含匹配完整模式的字符串的數(shù)組,?$out[1]是包含閉合標(biāo)簽內(nèi)的字符串的數(shù)組。
?
四、測試題-簡答題
1、explode除了爆炸的意思,還有什么意思?
解答:分割、分解、打碎
2、合并一個(gè)文檔中多行為一行的方法是什么?
解答:替換,把換行符全部替換成空格。$con=str_replace(PHP_EOL,"",$con);
3、PHP正則中的多行匹配修飾符是?
解答:s。多行匹配修飾符s:$pattern="/<".$val.">.*?<\/".$val.">/s";。
4、如何解決file_put_contents函數(shù)?failed to open stream: Invalid argument的問題?
解答:把文件名從中文名改成英文名就OK了。
5、如何設(shè)置php文件的輸出到頁面的字符集?
解答:meta標(biāo)簽的charset屬性,echo '<meta charset="utf-8"/>';。
6、preg_match_all的兩個(gè)結(jié)果參數(shù)分別代表什么?
解答:?$out[0]是包含匹配完整模式的字符串的數(shù)組,?$out[1]是包含閉合標(biāo)簽內(nèi)的字符串的數(shù)組。。
7、php中explode函數(shù)的作用是什么?
解答:用一個(gè)字符串去分割另外一個(gè)。
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MicroPython支持图形化编辑了:
- 下一篇: Redis 常见命令