0

私は次のようなリンクがあります

<a href="#" class="social google">Google</a>
<a href="#" class="social yahoo">Yahoo</a>
<a href="#" class="social facebook">Facebook</a>

match only anchor text今、正規表現を使用したいと思います。
つまり、最初のリンクのテキストGoogleにのみ一致する必要があります。

私はこのコードを試しました。

(?<=<a href="#" class="social .+?">).+?(?=</a>)

しかし、期待どおりに機能していません。

誰かが私に正しい構文を教えてもらえますか?

4

4 に答える 4

1

後読みと先読みを使用して不要な部分を除外する代わりに、キャプチャ グループを使用して必要な部分のみを取得することをお勧めします。

<a href="#" class="social .+?">(.+?)</a>

概念的には、ルックアラウンドは重複一致に使用されます。ここでそれらの機能が必要なようには見えません。

(もちろん、通常の警告が適用されます)

更新:これはベスト プラクティスの問題だけではありません。後読みを使用する正規表現は、後読み部分が他の一致と重なる可能性があるため、実際には正しくない結果を生成します。次の入力を検討してください。

<a href="#" class="social google">Google</a>

...

<a class="bad">foo</a>

正規表現は「Google」に一致するだけではありません。.+?クラス文字列の一部のみに一致するはずの は、テキスト内の別のリンクまで展開できるため、「foo」にも一致します。

于 2013-02-11T15:09:20.710 に答える
0

おそらく正しい結果が得られますが、他の一致するグループ (?...) があるため、一致したデータには不要なデータも含まれています。

一致しないグループ (?:...) を使用して、一致に表示したいものをグループ自体 (.+?) 内に入れてみることができます。

于 2013-02-11T15:08:30.187 に答える
0

次の正規表現を試してください。

\<a .*?\>(.*?)\<\/a\>

編集 1 - この正規表現は、css クラス「social」を持つアンカーと一致します。

\<a .*?class=".*?\bsocial\b.*?\>(.*?)\<\/a\>
于 2013-02-11T15:09:50.907 に答える
0

これを試して

  "~<a(>| .*?>)(.*?)</a>~si"

また

   "/<a(>| .*?>)(.*?)</a>/"

php サンプル

  $notecomments ='<a id="234" class="asf">fdgsd</a> <a>fdgsd</a>';

  $output=preg_replace_callback(array("~<a(>| .*?>)(.*?)</a>~si"),function($matches){
       print_r($matches[2]);
       return '';
   },' '.$notecomments.' ');

これにより、すべてのアンカーテキストが得られます

これは class="social" のみを返します

  "#<a .*?class=\".*?social.*?\".*?>(.*?)</a>#"

サンプル

  $notecomments ='<a id="234" class="fas social ads">fdgsd</a> <a>fdgsd</a>';

  $output=preg_replace_callback(array("#<a .*?class=\".*?social.*?\".*?>(.*?)</a>#"),function($matches){

     print_r($matches);
 return '';},' '.$notecomments.' ');
于 2013-02-11T15:05:05.140 に答える