1

私がやっていることは次のとおりです。Simple HTML Dom を使用して外部サイトから HTML をスクレイピングしてから、スペースを取り除き、Regex を使用して必要な情報を取得して配列に入れようとします。外部サイトが HTML を変更するまで、このコードは完全に機能していたので、新しい正規表現を考え出す必要がありました。必要なものをすべてキャプチャしているように見える正規表現を作成しました (regexr.com を使用しました) が、コードにプラグインしたため、何らかの理由で機能しません。PHPは次のとおりです。

<?php
header("Content-Type: text/plain");

require('../classes/simple_html_dom.php');
$html = file_get_html('http://www.***.com/');
$player_array = array();
foreach($html->find('table#herodev_list td') as $ele){
    $ele = $ele->innertext;
    $html_string = $html_string.$ele;
}
$html_string = str_replace(" ", "", $html_string);
$regex = '/(?<=/avatar/).+?(?=/)/';
preg_match_all($regex, $html_string, $matches);
foreach($matches[0] as $player){
    array_push($player_array, strtolower($player));
}
print_r($player_array);

問題は preg_match_all にあるようです - マッチ配列が空なので、何もマッチしなかったと思います。$html_string が通常どのように見えるかのサンプルを次に示します。

<imgsrc="http://minotar.net/avatar/Kainzo/10.png"><imgsrc="http://minotar.net/avatar/PuffinMuffin19/10.png"><imgsrc="http://minotar.net/avatar/neows0/10.png"><imgsrc="http://minotar.net/avatar/Sniped105/10.png"><imgsrc="http://minotar.net/avatar/EJBomber26/10.png"><imgsrc="http://minotar.net/avatar/GiantBeardedFace/10.png"><imgsrc="http://minotar.net/avatar/Montelu/10.png"><imgsrc="http://minotar.net/avatar/GreekCrackShot/10.png"><imgsrc="http://minotar.net/avatar/Marcellinius/10.png"><imgsrc="http://minotar.net/avatar/HelsEch/10.png"><imgsrc="http://minotar.net/avatar/NZD2000/10.png"><imgsrc="http://minotar.net/avatar/Mrchucklez/10.png"><imgsrc="http://minotar.net/avatar/Dragondrakar/10.png"><imgsrc="http://minotar.net/avatar/malita55/10.png"><imgsrc="http://minotar.net/avatar/Dazzlar/10.png">

私の推測では、PHP の正規表現エンジンが Regexr と何らかの形で異なっているか、何か愚かなことをしているだけです。このアプリを最初に作成してから数か月が経過しているため、その内部の仕組みは記憶に新しいものではありません。どんな助けでも大歓迎です。

また、「HTML の解析に正規表現を使用しないでください...」という古い言い回しはやめてください。知っている。

ちなみに、これは私の古い正規表現で、正しく機能していました (もちろん、入力は異なります):
(?<=^|>)[^><]+?(?=<|$).

4

1 に答える 1

4

正規表現コードで / をエスケープする必要があります。

-編集-

ascii-lime は、区切り文字を英数字以外の別の文字に変更できることも指摘しました (例外あり)。これを行うには、式の最初と最後にある / を選択した文字に変更します。例:

'/.+\/regex.com\/index.html+./'

'!.+/regex.com/index.html+.!'
于 2012-08-22T05:22:54.100 に答える