2

私はここの初心者です。PHP で正規表現を使用する際に奇妙な問題に直面しています。

$result = "some very long long string with different kind of links";

$regex='/<.*?href.*?="(.*?net.*?)"/'; //this is the regex rule

preg_match_all($regex,$result,$parts);

このコードでは、結果の文字列からリンクを取得しようとしています。ただし、.net を含むリンクのみが提供されます。しかし、.com を含むリンクも取得したいと考えています。このために、私はこのコードを試しました

    $regex='/<.*?href.*?="(.*?net|com.*?)"/';

しかし、それは何も示していません。

私の悪い英語でごめんなさい。

前もって感謝します。

更新 1:

今私はこれを使っています

$regex='/<.*?href.*?="(.*?)"/';

このルールは、文字列からすべてのリンクを取得します。しかし、これは完璧ではありません。「javascript」などの他の部分文字列も取得するためです。

4

4 に答える 4

3

|文字はキャプチャ グループ内のすべてに適用されるため、または のいずれかに(.*?net|com.*?)一致します。.*?netcom.*?(.*?(net|com).*?)

追加のキャプチャ グループが必要ない場合は、 を使用できます(.*?(?:net|com).*?)

を使用することもできます(.*?net.*?|.*?com.*?)が、これは不要な繰り返しのためお勧めできません。

于 2013-04-30T17:01:31.057 に答える
1

これを試して:

$regex='/<.*?href.*?="(.*?\.(?:net|com)\b.*?)"/i';

またはそれ以上:

$regex='/<a .*?href\s*+=\s*+"\K.*?\.(?:net|com)\b[^"]*+/i';
于 2013-04-30T17:01:38.573 に答える
1

正規表現は.*?netorとして解釈されcom.*?ます。あなたがしたいでしょう(.*?(net|com).*?)

于 2013-04-30T17:01:12.313 に答える
0
<.*?href

問題です。これは、同じタグに属しているかどうかに関係なく<、現在の行の最初から最初の まで一致します。href

一般に、HTML を正規表現で解析しようとするのは賢明ではありません。絶対にそれを行うと主張する場合は、少なくとももう少し具体的にしてください(ただし、まだ完全ではありません):

$regex='/<[^<>]*href[^<>=]*="(?:[^"]*(net|com)[^"]*)"/'; 
于 2013-04-30T19:47:04.990 に答える