2016-07-20 5 views
2

こんにちは、私の質問は簡単です:マッチ複数回グループ

私は、彼らがPCRE正規表現で<figcaption>している場合にのみ、記事内のすべての可能なハッシュタグをマッチさせたいです。例えば:

<figcaption>blah blah #hashtag1, #hashtag2</figcaption> 

私はhttps://regex101.com/r/aL9vS8/1ここに試みをし、最後に?#hashtag1から#hashtag2にキャプチャを変更しますが、両方を取得することはできません取り除きます。

私はPHPの1つの正規表現でも実行可能かどうかはわかりません。

私を助けてくれると思いますか? :)

(実際には再帰(?R)??:pで作業していても)方法がない場合は、可能な限り効率的な方法を提案してください。

ありがとうございました!

[EDIT]

方法がない場合は、私のPHPの次のアイデアはにある:

  1. マッチコールバックの試合でpreg_replace_callback
  2. #hashtagのすべてのインスタンスを持つすべてのfigcaption。

これについてご意見はありますか?より良い方法がありますか?私の記事はあまり長くありません。

+0

figcaptionはhtmlタグで参照してください。 JSを使用してfigcaptionのテキストを取得し、正規表現を使用してハッシュタグを検索する検索を開始できます。 – rmondesilva

+1

[JavaScript Regexpで任意の数のグループをキャプチャするにはどうすればいいですか?](http:// stackoverflow。com/questions/3537878/javascript-regexpのグループの任意の数を取得する方法) –

+0

ここでのポイントは、「任意の数のグループ」に一致する必要はないということです。この質問は上記の欺瞞ではありません。実際には、JSタグを削除する必要があります。共有しようとしたのはPCRE正規表現です。 –

答えて

2

最も効率的な方法のパフォーマンスが賢明

PCRE正規表現でいくつかの区切り文字の間にいくつかのテキストと一致する最も確実な方法は\G operatorでカスタム境界線を使用しているを示唆してください。ただし、末尾の境界はマルチ文字列で、テキストは一致するが、</figcaption>にはtempered greedy tokenが必要です。このトークンは非常にリソースを消費するため、展開する必要があります。 <figcaption一致するか、以前の終わり -

  • (?:<figcaption|(?!^)\G)

    (?:<figcaption|(?!^)\G)[^<#]*(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*\K#\w+ 
    

    regex demo

    詳細を参照してください:ここで

    は、あなたの仕事のために、高速で信頼性の高いPCRE正規表現であります成功一致
    詳細:
    (?:<figcaption|(?!^)\G)のみのグループを意味する非捕捉基(?:...))であり、すなわち、(このグループにマッチしたものを追跡しません1)リテラルテキスト<figcaptionまたは2)(?!^)\G - 前の成功した一致の後の位置(ただし、\Gも一致することに注意してください)。2つの選択肢(|は交互の演算子です)に一致する値は、スタックが作成されていないのでグループスタックに保持されません。文字列の先頭に負のルックアヘッド(?!^)を追加して、その動作を除外する必要があります)。
  • [^<#]*
  • - 0+ <#
  • (?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*以外の文字 - の0+配列:
    • (?:<(?!\/figcaption>)|#\B) - 0から/figcaption>又は#ワードチャー
    • [^<#]*
    • と続かないと続かない< + <および#
  • 以外の文字 \Kから

さらに詳細#と1+単語文字 - これまで

  • #\w+にマッチしたテキストを省略:

    • \Kを:

    エスケープシーケンス\Kは任意のpr最後にマッチしたシーケンスには含まれないようにしてください。例えば、パターン:

    foo\Kbar 
    

    試合foobar、それはbarマッチしたことを報告しています。この機能は、lookbehindアサーションに似ています。

    • (?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*:ここで、我々はを繰り返す必要がある場合、我々は唯一のグループに数量詞*を設定することができる(サブパターンのシーケンスをゼロ回以上一致可能にするために、外側の非捕捉基(?:...)*を有しますシーケンスサブパターンの)と内側の非キャプチャグループ(?:<(?!\/figcaption>)|#\B)[^<#]*が縮小するだけの方法である<(?!\/figcaption>)[^<#]*|#\B[^<#]*(単にグループ共通の「接尾辞」[^<#]*の前に2つの異なる選択肢<(?!\/figcaption>)#\Bに長いタグで
    • ラッピング:。ちょうど使用

    コード:<span class="highlight">$0</span>置換パターンを持つ

    $re = '~(?:<figcaption|(?!^)\G)[^<#]*(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*\K#\w+~'; 
    $str = "<figcaption>blah # blah #hashtag1, #hashtag2</figcaption> #ee <figcaption>#ddddd"; 
    $subst = "<span class=\"highlight\">$0</span>"; 
    $result = preg_replace($re, $subst, $str); 
    echo $result; 
    

    PHP IDEONE demo

  • +0

    Wawはとても感謝しています!それは素晴らしいと働いて聞こえます...私はより良いあなたの正規表現をステップバイステップで理解し、後で交換のためのハッシュタグをキャプチャするのを助けることができますか? – antoni

    +0

    ハッシュタグをキャプチャする必要はありません。この方法で*マッチします。タグが壊れていても、これは開かれた '

    +0

    あなたの例を試してみるWawは私が望む置き換えをすることができます。完璧!驚くばかり!ちょうどあなたはあなたのパターンをより多くの説明に分割したいと思っています。それは、笑を理解するのに時間がかかるでしょう – antoni