0

Web サイト (bit.ly/1cjZR29) をより適切な形式に解析する 3 つの正規表現パターンがあります。

$line[$item] = preg_replace("/\<(td|th|table|tr|div)(.*?)\>/", "|", $line[$item]);
$line[$item] = preg_replace("/\<\/(td|th|table|tr|div)\>/", "|", $line[$item]);
$line[$item] = preg_replace("/(.)\\1{3,}/sS", '$1', $line[$item]);

それらを1行にまとめたい。

私が試したとき

$line[$item] = preg_replace("/\<(td|th|table|tr|div)(.*?)\>(.*)\<\/(td|th|table|tr|div)\>/", "|", $line[$item]);

何も一致しませんでした。3行目は空白を削除するためのものです。誰でも私を助けることができますか?アドバイスありがとう。

4

2 に答える 2

2

HTML を解析するために正規表現を使用するべきではありません。@Marty Wallaceが提案したのと同じ理由で、 PHP Simple DOM Parserなどのパーサーを使用してそれを行うことができます。

また、正規表現はすでに比較的複雑であり、それらをマージしようとしても、メンテナンスの悪夢になるだけです。

于 2013-08-02T07:44:49.093 に答える
1

最初の 2 つのルールを組み合わせて、タグ間のコンテンツを取得できます。空白は扱いにくい場所です。条件付き一致は可能ですが、1 つのルールで条件付き置換を行うことはできません。したがって、htmlタグまたは余分な空白に一致してこれに置き換えると言うことができますが、いつhtmlタグがこれに置き換えられるか、空白がそれに置き換えられるかはわかりません...あなたができる最善のことは、空白を直接チェックすることですタグの前後。

$test = preg_replace("/\s*(<(table|tbody|tr|td|th|div)(.*?)>)*\s*([^<\s]+)\s*(<\/(table|tbody|tr|td|th|div)>)*\s*/m", "| $4 |", $test);

あなたが提供したリンクを使用して、ランキング テーブルの html を取得し、あなたが探していると思われるものを取得することができました..

| | || ランク || レベル || 名前 || || RemainExp || || レース || 1 || 302 || || n0ise || 220.301.329 || || エイディアン || 2 || 302 || ....

しかし、これは値内の余分な空白を処理しません。たとえば、「Remain」と「Exp」の間に 3 つのスペースがあり、開始タグ間の空白は問題ないことがわかりましたが、最後</td></tr></table>タグの空白は適切に処理されませんでした. のような一致しないタグも誤って処理します<a>。これが、パーサーを使用するように言われている理由です。html ソースを厳密に制御できない限り、おそらくカーブボールを先に進めることになるからです。しかし、それが 1 回限りの HTML スクレイピングや、完全なフレームワークを追加するのがやり過ぎになる (非実稼働) 状況である場合は、正規表現の練習をやめさせないでください。

また、HTML タグを簡単に削除するために私が見つけたもう 1 つのヒントは、jQuery を使用して HTML 内部の要素にアクセスし、.text()関数を使用してタグを削除することです。テキストサーバー側を処理する必要がない場合は、それを検討するかもしれません

例: JsFiddle

于 2013-08-02T10:35:19.727 に答える