2016-08-05 9 views
1

ウェブサイトから情報を抽出しようとしています。私はsome text hereで始まる部分(正規表現または他の溶液で)を見つけると、そのからtext to extractを抽出したいPHPでHTMLを解析して値を抽出する

<th>Some text here</th><td>text to extract</td> 

はそのように見ている節があります。

は、私は、次の正規表現のソリューションを使用しようとしていた。

$reg = '/<th>Some text here<\/th><td>(.*)<\/td>/'; 
preg_match_all($reg, $content, $result, PREG_PATTERN_ORDER); 

print_r($result); 

を、それは私にちょうど空の配列を与える:

Array ([0] => Array () [1] => Array ()) 

どのように私は私の正規表現は、希望値を抽出するために構築する必要がありますか?または、それを抽出するために他にどのようなソリューションを使用できますか?

+1

これは問題なく再現できません... – Bobot

+1

@ Bob0tが正常に動作することを確認できます。正規表現は少なくとも –

+1

@ mmmの正しいことです。この説明は現代の正規表現エンジン*(特にPHPで使用されるもの)*とは何の関係もなく、コンピュータサイエンスの意味での「正規表現」に関するものです。要するに、現在の質問は、この質問の重複ではありません。なぜなら、PHP、Perl、Ruby、.netなどで使われている正規表現エンジンにそれを適用しようとすると説明が間違ってしまうからです。 * –

答えて

3

のXPathの使用:

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($html); 
libxml_clear_errors(); 

$xp = new DOMXPath($dom); 

$content = $xp->evaluate('string(//th[.="Some text here"]/following-sibling::*[1][name()="td"])'); 

echo $content; 

XPathクエリの詳細を:

string( # return a string instead of a node list 
    // # anywhere in the DOM tree 
    th # a th node 
    [.="Some text here"] # predicate: its content is "Some text here" 
    /following-sibling::*[1] # first following sibling 
    [name()="td"] # predicate: must be a td node 
) 

あなたのパターンがうまくいかない理由は、おそらくtdの内容に改行文字(ドットでは一致しません)

+0

素晴らしいソリューション、ありがとう! – Gacek

1

これにはDOMDocumentを使用できます。

[email protected]::loadHTML($content); 
$extractedText=NULL; 
foreach($domd->getElementsByTagName("th") as $ele){ 
    if($ele->textContent!=='Some text here'){continue;} 
    $extractedText=$ele->nextSibling->textContent; 
    break; 
} 
if($extractedText===NULL){ 
//extraction failed 
} else { 
//extracted text is in $extractedText 
} 

(コメントの誰かがすでに指摘したように、正規表現は、一般的にHTMLを解析するための悪いツールです)

関連する問題