1

私はそのような文字列を持っています:

<li class="level0 nav-2 last level-top parent">
   <a href="#" class="level-top"><span>XYZ</span></a>
   <ul class="level0">
      <li class="level1 nav-2-1 first"><a href="#"><span>Farben</span></a></li>
      <li class="level1 nav-2-2 last"><a href="#"><span>Muster</span></a></li>
   </ul>
</li>

ここで、最後の li に一致させたいのですが、文字列のある位置で XYZ と表示されている場合に限ります。私は試した

/<li class="level1 nav-(\d+)-(\d+) last">.+(<\/li>)/

これは最後のliを見つけますが、XYZが続く場合にのみ追加する方法がわかりません。私は試した

/.*XYZ.*<li class="level1 nav-(\d+)-(\d+) last">.+(<\/li>)/

しかし、それはうまくいきませんでした。

アイデア?ありがとう :)

4

4 に答える 4

2

REGEX を使用する場合:

XYZ(.*\n( |\t)*.*)*<li class="level1 nav-(\d+)-(\d+) last">.+(<\/li>)

「level1 nav-(\d+)-(\d+)」を正確にする必要がありますか?

後で何を使う必要がありますか?

たぶん、必要な部分を次のようにキャッチできます:

XYZ(.*\n( |\t)*.*)*<li class=".*last">(.+)<\/li>
于 2012-11-29T15:51:12.550 に答える
0

これがあなたのやり方です。

マークアップの解析でいつも行うように、DOMナビゲーションツールは整形式のマークアップに最適であることを指摘したいと思います。HTMLパーサーを使用してXMLドキュメントに変換し、XPathまたは他の多くのオプションを使用できます。場合によっては、これはやり過ぎであるか、整形式でないHTMLやその他のドキュメントタイプでは不可能ですらあります。そうは言っても、あなたの要求は(私の考えでは)次のように解釈されます。

別のListItemが続かないListItemHTMLオブジェクト<li...</ liに一致します。したがって、最後のオブジェクトですが、前に文字列「xyz」が付いている必要があります。

(?is)(?<=xyz.*?)<li\s(?!.*?<li).*?</li>

この正規表現は大文字と小文字を区別しないオプションとSingleLineオプションを使用し、一致する前に「xyz」とその他のものが存在することを要求し、別のListItemが続かないListItemを検索し、そのListItem全体を取得します。LookaheadとLookbehindはゼロ幅アサーションであり、キャプチャしないため、CaptureGroupは必要ありません。つまり、これは試合全体のキャプチャグループ0です。

マリオは貪欲さを提案しました。これは小さなチャンクには問題ありませんが、大きなドキュメントには多くのバックトラックが必要です。

(?is)xyz.*(<li.*?</li>)

ただし、この正規表現では、一致が貪欲であるため、キャプチャグループを使用する必要があります。キャプチャグループが悪いわけではありません。もう少しコードが必要です。

于 2012-11-29T16:30:54.317 に答える
0

正規表現を使用してみてください:

/XYZ(?s:.*)<li class="level1 nav-(\d+)-(\d+) last">.+(<\/li>)/

サブパターンのs修飾子により、.改行に一致させることができます。

于 2012-11-29T15:40:25.647 に答える
0

これは、jQuery の php ポートであるphpQueryを使用して非常に簡単に行うことができます。

次に、たとえば使用します

$liElm = pq("ul li:last:contains('xyz')");

phpQuery は正規表現ほど高速ではありませんが、処理がはるかに簡単で快適であることに注意してください。

于 2012-11-29T15:41:26.007 に答える