-1

こんにちは、私は正規表現がどのように機能するかを少し理解しようとしましたが、いくつかの非常に簡単な例で、私は静かに少し理解したと思います. ある人から、HTML ページからテキストの一部を取得するように依頼されました。私がつかまなければならないさまざまな部分はすべて、この var x (x は nuber です) = ' text text text text ' のような文字列の間にあります。だから私はこのようなことを試しました:

preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches);
print_r($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
   echo $matches[1][$i]."<br>";
}

私が間違っていなければ、数字、スペース、等号、その他のスペース、一重引用符で始まり、一重引用符、スペース、セミコロンで終わるテキストの一部の間のすべてを取得するように言っています. 私が間違っている?私はそれが私に空の配列を与える原因だと思います

4

2 に答える 2

2

フィードしている html ファイルのサンプル テキストがpreg_match_all()なければ、動作する正規表現を提供することはできません...

それでもなお、これはあなたを助けるかもしれません.

あなたのコード

preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches);
print_r($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
   echo $matches[1][$i]."<br>";
}

最初に気付くのは、forループcount($matches[0])内で使用し、ループ内からエコーするときに$matches[1]. の場合は必ずしも問題ではありませんがpreg_match_all、なぜ最後まで使用しなかったcount($matches[1])のですか?

2 番目に質問する必要があるのは、ファイルを開いてプレーン テキストを取得しましたか? 何かのようなもの:

$file = file_get_contents('/path/to/file.html'); //For example

さて、あなたの正規表現のために...

[0-9]単一の数字に一致します

\sSPACE、TAB、NEW_LINE などの任意の空白文字に一致します。

\=マッチ=

\'マッチ'

\;マッチ;

(.*?)任意の文字に 0回以上一致し、キャプチャします

注:後で詳しく説明するように、正規表現のクエスチョン マークは、最も早い機会に一致を停止するため、重要です。

今後

正規表現は機能し、必要なものを提供しますが、世界で最も読みやすいものではありません。

合わせる:0 = 'something to be captured in here' ;

以下を使用できます。/\d = '(.*?)' ;/

=、、'およびをエスケープする必要はありません;。また\d、の別名な[0-9]ので、同じ意味で使用できます (ただし、\d文字数が少なく読みやすい)。スペースを入力するだけでも使用する必要はありません\s(前述のような他の空白文字を含める必要がある場合を除きます)。

使用例は次のとおりです。

$string = "some text before 0 = 'captured by regex' ; some text afterwards...";

preg_match_all("/\d = '(.*?)' \;/", $string, $matches);
var_dump($matches);
/**
Output from var_dump

    array(2) {
      [0]=> array(1) {
        [0]=> string(27) "0 = 'captured by regex' ;"
      }
      [1]=> array(1) {
        [0]=> string(19) "captured by regex"
      }
    }
*/

次に、一致したテキストを次のように反復処理できます。

for($i = 0; $i < count($matches[1]); $i++){
    echo $matches[1][$i], "<br>";
}

クエスチョンマークについて

?についてのポイントと、なぜそれ必要なのかを明確にするためです。

一般に、正規表現はソース テキストを可能な限り継続しますが、状況によっては (これが含まれます)、問題が発生する可能性があります。

?-(.*)の代わりに-なしで正規表現を使用した場合、正規(.*?)表現は最初からX = '最後まで' ;一致し、一致する予定のキャプチャ グループのいくつかが必然的に含まれます。ただし、を使用する?と、(この場合)の最初のインスタンスで停止するように正規表現に指示されます' ;

コード' ;の最後に を追加し、 .$string?

于 2013-09-10T22:54:46.420 に答える
0

答えてくれてありがとう、私は自分で解決しました。会社名、住所、メールアドレス、電話番号がいっぱいで、必要なテキストをコピーできませんでした。内部の html をコピーして正規表現テストの 1 つをオンラインで試してみたところ、必要なテキストの一部が \n \n \n でいっぱいになっていることに気付き、キャプチャできませんでした (閉じスラッシュ「/」の後の「s」) 長い回答に感謝し、議論についてより多くの知識を与えてくれました。

于 2013-09-12T07:47:52.330 に答える