php、preg_match、正規表現。私は何が間違っているのですか?
-
19-09-2019 - |
質問
これが私が一致させたいパターンです:
<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">
これが私がやっていることです:
$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';
preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);
print_r($matches);
印刷:
配列 ( )
解決
一般的なルールとして、正規表現は、HTMLを解析する非常に貧弱な手段です。彼らは信頼できず、本当に複雑になる傾向があります。はるかに堅牢な解決策は、HTMLパーサーを使用することです。見る PHPとDOMを使用してHTMLを解析します.
あなたの表現に関しては、私は見えません <div class="productTitle"
ソースのどこでもそこから始めます。同様に、あなたはURLを解析しようとしていますが、アンカータグ(直接または十分なワイルドカードを介して)について言及していないので、そこでも失敗します。基本的に、その表現はあなたが解析しようとしているHTMLのようには見えません。
他のヒント
...またはこれ:
preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);
それもトリミングします。
パターン:
/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m
リンクとテキストを大まかに取得しますが、DOMライブラリを使用するとはるかに優れた方法です。
あなたはこれを試すことができます:
<a href=".*?">([\s\S]*?)</a>
所属していません StackOverflow