0

私は正規表現の初心者です。ブロック引用符の間のすべてを選択したいが、p タグが含まれているものは無視したい。

誰かが私を助けてくれますか?

以下は preg_match() 経由で見つけることができます

<blockquote><a>this is a link</a><blockquote>

しかし、これではありません

<blockquote><p><a>this is a link</a></p></blockquote>
4

2 に答える 2

0

@Dagon がコメントしたように、HTML を正規表現で解析することは悪い考えです™</a>。

とはいえ、いくつかの仮定を立てれば可能です。

  • は、存在する場合<p>常に直後になります<blockquote>
  • <blockquote>s がネストされることはありません

次に、否定先読みアサーション<p>を使用して、次の正規表現を使用して一致を割引します: /<blockquote>(?!<p>)(.*?)<\/blockquote>/.

于 2013-09-05T22:07:20.573 に答える
0

これを行う明確な方法は、XPath で DOM を使用することです。

正規表現を使用する場合は、次のパターンを試すことができます。

$pattern = '~<blockquote\b[^>]*>(?:[^<]+|(?R)|<(?!/(?:blockquote|p)>))*</blockquote>~';

ネストされた blockquote タグを処理し、その位置に関係なく ap タグがある場合は一致しません。

于 2013-09-05T22:26:09.920 に答える