a
次のように、タグ間のすべてのコンテンツをclass
bc-de fg
HTML ファイルで取得したいと考えていました。
<a class="bc-de fg"> XXXXXXXXXXXXX </a>
そこで、次の正規表現を書きました。
$regexp = “<a\wclass="bc\wde">(.*?)<\/a>”
これはうまくいきません。正規表現は初めてなので、もっと練習しようとしています。
この正規表現を修正するにはどうすればよいですか?
これを試して :
$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);
これを試して:
$regexp = '/<a class="bc-de fg">(.*)<\/a>/';
preg_match_all($regexp, $subject, $matches);
あなたの答えはになります$matches
。これは、今述べたシナリオで機能するはずです。ただし、その場合、属性の順序が変更されたり、より多くのクラスが割り当てられたりすると、この正規表現は機能しません。これを行う最良の方法は、正規表現を使用する代わりにDOMを使用することです。
not演算子[^(<a\W*class="bc\-de fg"\W*>)+(</a>)+]
を使用できます。^
次のようなものを試してください$regex = ":<a class="bc-de fg">(.*?)</a>:mi";
:
ので、常にスラッシュをエスケープする必要はありません.
改行文字 \r および \n を除く任意の 1 文字に一致します。*?
前の項目を 0 回以上繰り返します。これは、役に立つと思われる簡単なチートシートです。
regex
html やネストされた構造を超えることは悪い習慣と見なされます。DOM
代わりに使用してください。
正規表現の問題はエスケープ文字です(正規表現文字列を一重引用符で囲みます)。#...#
また、正規表現の開始文字と終了文字 (または)もありません\...\
。