2011-02-04 18 views
1

私はいくつかのPHPをデバッグしようとしていますが、私の正規表現ではあまり熱心ではありません、誰かが私のためにこれを翻訳してくださいできますか?このRegex文字列は何を意味しますか?

public static function fetch($number) 
    { 
     $number = str_replace(" ", "", $number); 
     $html = file_get_contents('http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=' . $number); 
     preg_match_all('/\<td style="width.*\<b\>(.*)[: ]*\<\/b\>/msU', $html, $keys); 
     preg_match_all('/\<\/b\>.*\<td.*\>(.*)\<\/td\>/msU', $html, $values); 

     if (!$keys[1]) 
     { 
      return null; 
     } 

は、それが役立つ場合、コンテキストのPHPスニペットを保った(たとえそれが正規表現である場合):D おかげ:)

答えて

5

私は最初のもののみを翻訳していますが、2番目のものは似ています。

/     # regex delimiter 
\<td style="width # match <td style="width (unnecessary escaping of < !) 
.*     # match anything (as few characters as possible, see below) 
\<b\>    # match <b> (again, unnecessary escaping!) 
(.*)    # match anything (lazily) and capture it 
[: ]*    # match any number of colons or spaces 
\<\/b\>   # match </b> 
/msU    # regex delimiter; multiline option (unnecessary), 
        # dot-all option (dot matches newline) 
        # and ungreedy option (quantifiers are lazy by default). 

EDIT:Uは、ユニコードオプションではなく、ungreedyオプションです。私の間違い。正規表現は、私が代わりにこれらの正規表現を使用してお勧めしたい

:)結局それほど悪くはない:

私はそのは、次の構造と一致するようにしようと考えてい
/<td style="width.*?<b>(.*?)[: ]*<\/b>/s 
/<\/b>.*?<td.*?>(.*?)<\/td>/s 
+0

はい、それは悪い考えです。これは、あらかじめ構築されたパッケージからのものです。あなたの文字列を試してみますが、ターゲットサイトの構成が変更されてしまい、再書き込みが必要になることが懸念されます。ありがとう。 – Kyle

+0

@Kyle Sevenoaks、それでも、 'U'を落として、欲張りな量詞の後ろに疑問符を付ける方が良いです。 '/' -delimiters間の正規表現がコピーされた場合(god forbid!:))、 'U'はコピーされません。 –

5

多かれ少なかれ、それは<td style="width ..."><b>{extracted}: </b>

+0

を印刷しますので、ターゲットのウェブサイトに 'があった、それは'うこれらのテーブル要素のテキストを抽出しますか? – Kyle

+0

はい、 '...'はすべてにマッチします。 –

+1

2行目が何をしているのか忘れてしまいました.... – Xhalent

1

乃至{extracted}部分を返します正規表現を理解するのに役立ちます無料の(ただし登録が必要な)表現パーサーとテストツールであるExpresso(Windows用)をダウンロードすることをお勧めします。

+0

PHP正規表現と、ネット正規表現との間に多少の違いがあるかもしれませんが、これはExpressoが使用するものです。 – Xhalent

+0

@Xhalent:良い点、私はそれを考えなかった。 – Tony

0

<td width=.....><b>key:</b></td><td>value</td> 

その解析を文字列は2回、キーの場合は1回、最初の列から取り出され、2回目の値は2番目の列から取り出されます。

0

私はアドバイスをしたいと思います。あなたの正規表現は期待どおりに動作しないかもしれません。あなたの場合は、xpathを使用する方が良いです。

このスニペットを参照してください:

$str = " 
<html> 
    <body> 
     <table> 
     <tr> 
      <td style='width:500px'><b>foo : </b> bar</td> 
      <td style='width:200;vertical-align:'><b>baz :</b> qux</td> 
     </tr> 
     </table> 
    </body> 
</html> 
"; 

$xml = simplexml_load_string($str); 

$results = array(); 
foreach($xml->xpath('//td[@style][b]') as $row) { 
    $value = trim(sprintf("%s", $row)); 
    $key = trim((string)$row->b, ' :'); 
    $results[$key] = $value; 
} 

var_dump($results); 

array(2) { 
    ["foo"]=> 
    string(3) "bar" 
    ["baz"]=> 
    string(3) "qux" 
} 
+0

残念ながら、私はリモートサイトから情報が得られていることを制御できません。間違ってしまったときに修正する必要があります。 :D – Kyle

関連する問題