1

私はこの単純なダミーテキストを持っています

<base href="http://wjbty.lc/"/?
<a href="common/home" />
<a href="common/home" />
<a href="/common/home" />
<a href="http://common/home" />
<a href="https://common/home" />
<a href="common/home" />

そして私の正規表現パターンは(?:(href="))(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"

href="それは正常に動作し、すべての相対リンクに一致しますが、結果の一致には常に含まれます。

href="結果から除外するにはどうすればよいですか。2つの答えがありますが、どれも機能していないため、誰でもテストしてから答えてください。

正規表現バディでの出力

4

3 に答える 3

5

あなたの式には、余分な括弧のセットがあります

(?:(href="))

そのはず

(?:href=")

編集:これが欲しいと思います

/(?:href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"/

そのため、閉じた引用符もキャプチャされません。また、preg_match_all が 1 つまたは複数の配列を返すことも覚えておいてください。最初の配列セットは合計キャプチャです。2 番目の配列セットはグループ キャプチャです (必要なもの)

追加パラメータ

flags パラメータは、PREG_PATTERN_ORDER または PREG_SET_ORDER にすることができます

PREG_PATTERN_ORDER は、array[0] がすべてのキャプチャ情報になることを意味し、array[1] は括弧内にキャプチャした情報になります。

PREG_SET_ORDER は、一致ごとに配列要素が存在することを意味します。match[0] は合計情報、match[1] はキャプチャ グループです。

于 2013-09-23T07:58:22.643 に答える
1

先読みと後読みを使用する場合は、次のように答えます。

(?<=href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)(?=\")

ここでデモ: http://regex101.com/r/gS8iR6

于 2014-04-03T06:05:28.257 に答える
1

もう 1 つの方法は、この\K機能を使用して、パターンの先頭 ( まで\K) で一致した部分文字列を一致結果から除外することです。例:

\shref="\K(?!(?:https?:/)?/)[^"]+

アドバイス: パターン区切り文字としてスラッシュを使用する場合は、パターン内のスラッシュをエスケープする必要がありますが、他の文字 ( ~.

取得したいのは一致全体であるため、グループをキャプチャする必要はまったくないことに注意してください。

必要な場合は、パターンの最後に先読みを追加して、終了二重引用符の存在を確認できます。(?=")

于 2014-04-02T19:53:58.997 に答える