おそらく、プログラマーはサイト管理者を大幅に削減し、他の人のサイトからデータをインポートする問題に直面します。 このタスクは非常に簡単で、特別な知識を必要としません...唯一の質問はラッパーです。 この記事を書いているMODxに関する記事のコレクションを補完するために、誰かが役に立つかもしれません。
注意! このレコードには実用的な価値はなく、「MODxバックエンドでの作業の簡単な例」のような理論上の負担だけがあります。そしてタスクは
、 example.comページからテーブルを
解析し、それを再配置してWebサイトに配置することでした。 5セント
実際には、cURLを使用します。この目的のために最適なツールを見つけることができないためです。 まず、2つのテンプレート
parserTplOuterと
parserTplInnerを作成します。それぞれ、ラッパーとその「内部」です。 個人的に私はテーブルを作ったので、この例ではこれに焦点を当てますが、与えられたスタイルでディーバを作ることを禁止する人はいません。
parserTplOuter <table> [+content+] </table>
ラッパーは特別に個別に作成されるため、コードに入らずに外観、要素の配置、またはその他のVerstal機能を登録できます。 聖なるMVCモデルを順守してください!
parserTplInner <tr>
<td>►+ 0 +†</ td> <td> [+ 1 +†</ td> <td> [+ 2 +†</ td> <td> [+3+] </ td>
</ tr>
ここでは、数値識別子を作成した理由を説明します。まず、連想配列は開発中に単純に必要ではありませんでした:)、次に、混乱する可能性がありますが、「行」に別の要素を追加するのが非常に簡単な場合、標準化が行われます。
さて、jarファイルを取得し、それらをジュースで満たし、
parserというスニペットを作成しましょう。
<?php
if(empty($ url))return false; //スニペットにアドレスが与えられていない場合-実行を終了
//ここでは、URLの有効性についてさらに多くのチェックを行う必要がありますが、ここに悪を書くことはありません。
//そして、私たちはカツオドリへのアクセスを許可しません;)
$ tplInner =(空($ tplInner))? 'parserTplInner':$ tplInner; //デフォルトを設定
$ tplOuter =(空($ tplOuter))? 'parserTplOuter':$ tplOuter; //スニペットのチャンク
$ c =(空($カウント)||(!is_numeric($カウント)))? 6:$カウント。 //レコードの数に制限を加えましょう
$ c =($ c> 100)? 100:$ c; //最大数
$ c =($ c <1)? 1:$ c; //最小数
// curlセッションを初期化します
$ ch = curl_init();
// URLおよびその他の必要なパラメータを設定します
curl_setopt($ ch、CURLOPT_URL、$ url);
curl_setopt($ ch、CURLOPT_HEADER、0);
curl_setopt($ ch、CURLOPT_TIMEOUT、5);
curl_setopt($ ch、CURLOPT_RETURNTRANSFER、1);
//ページをロードして変数に返します
$ html = curl_exec($ ch);
//セッションを終了し、リソースを解放します
curl_close($ ch);
if(mb_strlen($ html)<100){return '';} //回答が短すぎて終了できない場合は、終了します。
//ここでは注意が必要です。最も多様なコードが返される可能性がありますが、標準のHTMLフレームの合計は約100文字..
$ pattern = "/ <table(?:[^>] +)>([\ s \ S] +)<\ / table> / i"; //この部分は、サイトからすべてのテーブルを切り取ります。
//理論的には、このテンプレートをチャンクにプッシュしてそこに変更できますが、実践が示すように、構文解析はそれぞれのケースでほぼ一意であり、正しい結果を得るためにパラメーターを調整するよりもコードに基づいて独自に記述する方が簡単です...
preg_match($パターン、$ html、$一致);
設定解除($は[0]に一致); //覚えていない-見つかった文字列全体が0要素に書き込まれ、必要ありません
$ array = explode( '</ tr>'、$ matches [1]); //ここで私は非常に難しい方法ですべての行を配列要素に変換しました
$ separator = '| == |'; $ table = array(); //準備して...
foreach($配列として&$値){
//(動作中のクイックコード)
$ value = str_replace( '</ td> <td'、 '</ td>'。$ separator。 '<td'、$ value); // ...私の耳で失神しました:)
$ value = strip_tags($ value); //テーブルタグを定期的に削除するのは面倒でした。サービス文字セットと..でセルを分離する方が簡単です。
$ table [] = explode($セパレーター、$値); // ...このセパレータでstrip_tagsの残りを分割します
}
$ i = 0; //ここでは、0番目の要素がテーブルヘッダーであることは注目に値します。 必要ない場合は、1を設定して設定解除($ table [0])する必要があります。 処方する
$行= '';
foreach($テーブルを$行として){
//さて、各行を実行します
if($ i ++> $ c)break; //レコードカウンターを確認します
$ rows。= $ modx-> parseChunk($ tplRow、$ row、 '[+'、 '+]'); //行を書きます
}
echo $ modx-> parseChunk($ tplTable、array( 'content' => $ rows)、 '[+'、 '+]'); //行を挿入して結果を出力します
?>
実際にはこれが必要なすべてでした。今、これをサイトの適切な場所に挿入します。
[[parser?tplInner=`parserTplInner` &tplOuter=`parserTplOuter` &url=`http://example.com` &count=`10`]]
きちんとしたプレートが形成されるのを見てください。
このスクリプトは絶対に必要ありませんが、頭と灰白質が含まれているため、このスニペットをニーズに合わせて簡単に調整できます。 テンプレートまたは処理メカニズムの変更は非常に簡単です。テーブルを処理するのではなく、歌姫を登録して登録します。 そして、それによってすでに導かれているので、処理のためのデータを取得し、それらを表示して問題を解決する方法はまったく別の頭痛の種です。