1

HTML ファイルを調べて、渡した正規表現と一致するかどうかに基づいて要素を見つける正規表現があります。要素が一致するかどうかを判断する主な要素の 1 つは、ID です。ID は、私が使用することに決めたいくつかの特殊文字でなければなりません。問題は、HTML で ID を記述するときに二重引用符または単一引用符のいずれかを使用する人がいることです。どちらの場合もキャッチできるようにしたいです。したがって、私の正規表現は次のとおりです。

preg_match('@(<)([^\s]*).*(id)\s*=\s*["|\']{{ALViewElement_'.$viewElement.'}}["|\'][^/]*?(>)@i', $viewFile, $elementMatches, PREG_OFFSET_CAPTURE)

真ん中近くに私がいる場所が見えますid。等号の後には["|\']、最後に同じ引用符があります。

私のhtmlが次のようになっている場合、一致します:

<section  id="{{ALViewElement_resume}}" data-test="testing" >
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>

ただし、代わりに一重引用符を使用すると、一致しません。

<section  id='{{ALViewElement_resume}}' data-test="testing" >
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>

一重引用符を拾わないという正規表現の何が問題なのか理解できないようです。何か案は?

4

1 に答える 1

2

私はあなたに一般的な答えを与えます、そしてあなたはそれをあなたのケースに適応させることができます. 一重引用符または二重引用符に一致させるためのトリックは次のとおりです。

1) 後方\1参照を使用する (キャプチャ グループ 1 を参照):

遅延量指定子を使用した単純な方法:

(["']).*?\1

最適化されたより安全な方法(エスケープされた引用符を扱います):

(["'])(?>[^"']|["'](?<!\1)|(?<=\\)\1)*+\1

2) 代替を使用します。

(?>"....."|'.....')

キャプチャ グループを使用した興味深いバリアント:

(?|"...(###)..."|'...(###)...')

2 つのキャプチャ グループの番号は同じです。

注意: 問題はパターンに起因するものではありません。

于 2013-06-16T17:40:35.340 に答える