0

アンカータグで囲まれていないタグのみを選択することは可能<a></a>ですか?
システム全体を変更して次のようなものを使用することはできないDOMDocumentため、正規表現にこだわっています。これをしばらく検索しましたが、必要なものに対する答えが見つからないようです (またはその方法がわかりません)。

現在、選択したいすべてのタグを選択する単純な正規表現を使用していますが、アンカーで囲まれたタグの一部を除外する必要があり、これを修正する方法がわかりません。どんな助けでも感謝します。

サンプルデータ

Suspendisse potenti. Nam pellentesque eu lectus eget convallis. 
Curabitur <span>porta metus sem</span>, nec fermentum urna elementum ac. 
Praesent et ultrices urna. <span>Curabitur id nisl</span> in sapien ultrices laoreet vel et quam.
Cras nisi felis, vestibulum id adipiscing venenatis, dignissim vel tortor. 
<a><span>Integer sapien dolor</span></a>, pellentesque sed ultricies in, ornare eu felis. 
Cras volutpat hendrerit odio id aliquet. 

これでは、次の<span>ようなものですべてのタグを選択'/<span>(.*?)<\/span>/'しますが、それはすべてのスパンを選択します<a></a>

複数ステップのプロセスは、機能する限り問題ありません。つまり、1 つの式ですべてを選択する必要はありません。

4

3 に答える 3

0

どうぞ:

preg_match_all(
  '%\G(?:[^<]+|<a\b[^>]*>.*?</a>|<(?!span\b)[^>]*>)*\K<span[^>]*>.*?</span>%s',
  $subject, $result);

HTML パーサーを使用できないのです? :D

それを説明するために、まず、より読みやすい形式にします。

\G                        # (1)
(?:
    [^<]+                 # (2)
  |
    <a\b[^>]*>.*?</a>     # (3)
  |
    <(?!span\b)[^>]*>     # (4)
)*
\K                        # (5)
<span[^>]*>.*?</span>

仕組みは次のとおりです。

  1. \G連続する各マッチを、前のマッチが終了した位置から開始するよう強制します。

  2. タグの開始以外のもの

  3. 完全な<a>要素 (他の要素が含まれていないと仮定<a>)

  4. を除くその他のタグ<span>

  5. \Kマッチの開始位置をリセットするため、これまでにマッチしたものはすべてマッチの一部として扱われません。これは事実上、一致する文字数を気にしない肯定的な後読みです。

通常の免責事項が適用されます。完全に有効な HTML であっても、この正規表現が失敗する可能性はたくさんあります。たとえば、左山かっこ ( <) は、実際には他の多くの場所で見つかる場合でも、常にタグの開始を示していると想定しています。

于 2013-11-11T10:42:06.550 に答える
0

否定後読みを使用します。

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

これにより、-tag が<span>先頭にある-tags が除外<a>されます。

完全を期すために、完全な周囲のみで照合する必要がある場合は、否定的な先読みを追加します。

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

デモを見る: http://regexr.com?374pp

于 2013-11-11T08:18:54.243 に答える
0
(?<!<a.*?>)(<(?!a\b)(.*?\b).*?>.*</\2>|<(?!a\b).*?\b />)(?!</a>)

正規表現の視覚化

Debuggex デモ

これは、a-Tags で囲まれていないすべての HTML タグに一致する必要があります

span-Tags のマッチャーだけが必要な場合は、次のものを使用します。

(?<!<a.*?>)<span.*?>.*</span>(?!</a>)

正規表現の視覚化

Debuggex デモ

正規表現ルックアラウンド アサーションに関する詳細情報が必要な場合: http://www.regular-expressions.info/lookaround.html

于 2013-11-11T08:26:12.090 に答える