-2

a次のように、タグ間のすべてのコンテンツをclass bc-de fgHTML ファイルで取得したいと考えていました。

<a class="bc-de fg"> XXXXXXXXXXXXX </a>

そこで、次の正規表現を書きました。

$regexp = “&lt;a\wclass="bc\wde">(.*?)<\/a>”

これはうまくいきません。正規表現は初めてなので、もっと練習しようとしています。

この正規表現を修正するにはどうすればよいですか?

4

5 に答える 5

0

これを試して :

$str  = '<a class="bc-de fg">Testing</a>';

preg_match('/<a class="bc\-de\s*fg">(?P<link>.*)<\/a>/',$str,$matches);

echo "<pre>";
print_r($matches);

リンクを取得します$link = $matches['link'];

これにより、より正確な結果が得られます。

preg_match('/<a.*class="bc\-de\s*fg".*>\s*(?P<link>.*)\s*<\/a>/',$str,$matches);

于 2013-03-07T07:30:48.917 に答える
0

これを試して:

$regexp = '/<a class="bc-de fg">(.*)<\/a>/';
preg_match_all($regexp, $subject, $matches);

あなたの答えはになります$matches。これは、今述べたシナリオで機能するはずです。ただし、その場合、属性の順序が変更されたり、より多くのクラスが割り当てられたりすると、この正規表現は機能しません。これを行う最良の方法は、正規表現を使用する代わりにDOMを使用することです。

于 2013-03-07T07:30:54.333 に答える
0

not演算子[^(<a\W*class="bc\-de fg"\W*>)+(</a>)+]を使用できます。^

于 2013-03-07T07:32:11.683 に答える
0

次のようなものを試してください$regex = ":<a class="bc-de fg">(.*?)</a>:mi";

  • 区切り文字を使用した:ので、常にスラッシュをエスケープする必要はありません
  • .改行文字 \r および \n を除く任意の 1 文字に一致します。
  • *?前の項目を 0 回以上繰り返します。

これは、役に立つと思われる簡単なチートシートです。

于 2013-03-07T07:27:48.850 に答える
0

regexhtml やネストされた構造を超えることは悪い習慣と見なされます。DOM代わりに使用してください。

正規表現の問題はエスケープ文字です(正規表現文字列を一重引用符で囲みます)。#...#また、正規表現の開始文字と終了文字 (または)もありません\...\

于 2013-03-07T07:28:59.560 に答える