私は正規表現の初心者です。ブロック引用符の間のすべてを選択したいが、p タグが含まれているものは無視したい。
誰かが私を助けてくれますか?
以下は preg_match() 経由で見つけることができます
<blockquote><a>this is a link</a><blockquote>
しかし、これではありません
<blockquote><p><a>this is a link</a></p></blockquote>
私は正規表現の初心者です。ブロック引用符の間のすべてを選択したいが、p タグが含まれているものは無視したい。
誰かが私を助けてくれますか?
以下は preg_match() 経由で見つけることができます
<blockquote><a>this is a link</a><blockquote>
しかし、これではありません
<blockquote><p><a>this is a link</a></p></blockquote>
@Dagon がコメントしたように、HTML を正規表現で解析することは悪い考えです™</a>。
とはいえ、いくつかの仮定を立てれば可能です。
<p>
は常に直後になります<blockquote>
<blockquote>
s がネストされることはありません次に、否定先読みアサーション<p>
を使用して、次の正規表現を使用して一致を割引します: /<blockquote>(?!<p>)(.*?)<\/blockquote>/
.
これを行う明確な方法は、XPath で DOM を使用することです。
正規表現を使用する場合は、次のパターンを試すことができます。
$pattern = '~<blockquote\b[^>]*>(?:[^<]+|(?R)|<(?!/(?:blockquote|p)>))*</blockquote>~';
ネストされた blockquote タグを処理し、その位置に関係なく ap タグがある場合は一致しません。