3

Google で 2 日間検索しており、ここでは SOF で多くの検索を行っていますが、この正規表現 preg_match の問題を解決できません。住所を単純にスクレイピングしたいのですが、通常は簡単に行うことができますが、一部の住所の途中に改行があり、約 25 文字の空白があるため、コードは空の配列または NULL を表示します。

以下に、スクレイピングしようとしているものの例を示すソースコードと、これまでに失敗したコードを含めました。この日曜日の朝、私よりも経験豊富な人からの助けをいただければ幸いです。

ソース コードのサンプルはこちら。

<span style="font-size:14px;">736 
                  E 17th St</span><br />

これまでの私の試み;

$new_data = file_get_contents('someURLaddress');

$street_address_regex = '~14px\;\"\>(.*?)\<\/span\>\<br\s\/\>\s~s';

preg_match($street_address_regex,$new_data,$extracted_street_address);

var_dump ($extracted_street_address);
4

1 に答える 1

1

ドットを使用するのは恐ろしい習慣であるため、私はこれを行っているだけです。正規表現で何か間違ったことをしているという見返りは、Single-Line オプションを使用する場合です。これはリソースの膨大な浪費であり、ある時点で破綻します。

これは、99.9% 確実に使用する必要があるものです。

$street_address_regex = '~14px;">([^<]*)~i';

または、(何らかの理由で) < を正当な文字として期待している場合は、小なりを意味するか、太字やイタリックなどの書式設定タグを意味する場合、次のようにすることができます。

$street_address_regex = '~14px;">([^<]*<)*?\/span~i';

そして、文字列の最後の文字をフォーマットする必要がないほど気になる場合は<、次のようにすることができます。

$street_address_regex = '~14px;">((?:[^<]*(?(?!<\/span)<))*)~i';

.

このテスターでテストする

.

しかし、正直なところ、正規表現を使用するべきではありません。のストリップを見つけて、<span style="font-size:14px;">その長さを追加します (アドレスの開始点を取得するため)... 次に、 のストリップを見つけて、以前に見つかったインデックスのオフセットポイントを</span>入力します (アドレスの終了点を取得するため)。それらを引いて長さを取得します。次に、OriginalString、StartIndex、および Length を使用してsubstrをプルします。

たくさんのように聞こえますが、Regex の代わりに使用する小さな関数を作成し、OriginalString、StartString、および EndString を入力するだけです...次に、前述のメソッドを使用して StartString と EndString の間の内容を返します。関数を再利用可能にします。

その関数を使用すると、コードのその部分は文字通り少なくとも 10 倍高速に実行されます。正規表現はパターンにとって非常に強力ですが、パターンはありません.2つの静的文字列があり、それらの間のコンテンツが必要です。正規表現は、静的な文字列操作では非常に遅いです...特に、単一行でドットを使用する〜震え

$Input = '<span style="font-size:14px;">736 E 17th St</span><br />';
echo GetBetween($Input, '14px;">', '</span');

function GetBetween($OrigStr, $StartStr, $EndStr) {
    $StartPos = stripos($OrigStr, $StartStr) + strlen($StartStr);
    $EndPos = stripos($OrigStr, $EndStr, $StartPos);
    return substr($OrigStr, $StartPos, $EndPos - $StartPos);
}
于 2013-10-30T07:15:28.043 に答える