0

私はいくつかのプレグマッチを成し遂げようとしています。

私は基本的にこれを思いついた

preg_match_all('<a href="(.*?)">', $page, $result);

しかし、これの出力は

Array
(
    [0] => Array
     (
        [0] => a href="/stuff"
        [1] => a href="/stuffstuffstuff"

         and much more of this.

a href とスラッシュと引用符を削除して、コンテンツのみを保持したい。私は多くのことを試みましたが、それらのことが戻ってきます。

みんなありがとう

4

1 に答える 1

2

まず第一に、正規表現を使用してランダムな html を解析しようとしないでください。遅かれ早かれ、機能しなくなります。正規表現は html を解析するためのツールではなく、正しく解析できません。3 つの簡単な例:

<a href='stuff'> (different quotes)
<!-- <a href="stuff">-->
<a style='something' href="stuff">

これらはアプリケーションを壊します。他にも無数の例がありますが、それらは機能せず、壊れてしまいます! Chuck Norris でさえ正規表現を使用して html を正しく解析できません。

しかし、あなたはすでにそれを知っていると思います.これは既知のhtmlのごく単純で限られた量であり、一般に公開されることはないので、あなたの質問に戻りましょう:

preg_match_all は、区切り文字を含む正規表現を想定しており、その間に記述したすべてのものと一致します。あなたが書くなら

'<a href="(.*?)">' 

正規表現として、先頭の「<」を区切り文字として扱うため、一致しません。その周りにスラッシュ (またはその他の文字) を書きます。

preg_match_all('/<a href="(.*?)">/', $page, $result);

これで、次のように一致します。

[0] => <a href="/stuff">

しかし、「/stuff」だけが必要です。$result は配列を提供します。$result[0] は一致したすべての正規表現であり、$result[1] は最初に () 一致し、$result[2] は 2 番目に () 部分式が一致する、というように... $result[1] を調べるには、必要なものが見つかるはずです。

于 2012-12-04T00:47:13.060 に答える