0

HTML文字列の最初の画像タグを選択する必要がありますが、前にテキストがない場合に限ります。したがって、たとえば、次のように一致する必要があります。

<p><span><a href=""><img src="some.jpg"></a></span></p>

しかし、これと一致するべきではありません:

<p>Text text text<span><a href=""><img src="some.jpg"></a></span></p>

これも:

<p><span>Text text text<a href=""><img src="some.jpg"></a></span></p>

私は次のようなことを試しました:

/(<[^>]+>)<img/is

imgタグの前のタグを選択できるようにしますが、img要素の前のタグに含まれる可能性のあるテキストを除外することはできません。

いくつかの考え?

4

3 に答える 3

0

こんな感じかもしれない

$str = '
<p><span><a href=""><img src="some1.jpg"></a></span></p>
<p><span>Text text text<a href=""><img src="some2.jpg"></a></span></p>
<p><span>Text text text<a href=""><img src="some3.jpg"></a></span></p>
<p><span><a href=""><img src="some4.jpg"></a></span></p>';

preg_match_all('#<p>\s*<span>\s*<a.*(<img[^>]+>)#U', $str, $match);

echo '<pre>' . htmlspecialchars(print_r($match, 1)) . '</pre>';
于 2013-02-22T10:17:31.203 に答える
0

正規表現ソリューション:

$regex='#^(<[^>]+>)*<img#i';
var_dump(preg_match($regex,'<p><span><a href=""><img src="some.jpg"></a></span></p>'));
var_dump(preg_match($regex,'<p>Text text text<span><a href=""><img src="some.jpg"></a></span></p>'));
var_dump(preg_match($regex,'<p><span>Text text text<a href=""><img src="some.jpg"></a></span></p>'));

出力:

int(1)
int(0)
int(0)

ライブデモ

編集

DOM / XPathソリューション:

foreach(array('<p><span><a href=""><img src="some.jpg"></a></span></p>',
'<p>Text text text<span><a href=""><img src="some.jpg"></a></span></p>',
'<p><span>Text text text<a href=""><img src="some.jpg"></a></span></p>') as $html)
{
    $dom=new DOMDocument();
    $dom->loadHTML($html);
    $xpath=new DOMXPath($dom);
    var_dump($xpath->query('//img[string-length(//text())<=0]')->length);
}

また、を出力します1,0,0

ライブデモ

編集#2:XPathソリューションは引き続き機能しますが、テキストが後に続く状況も排除しました<img>質問は「前に」が文字通り意味することをほのめかしたので、私は正規表現がここでより良いツールであると思います。

于 2013-02-22T10:20:20.140 に答える
0
$content = strip_tags($yourContent, '<p><img>');
preg_match_all("#<p>(<img[^>]+>)#U", $content, $out);
print_r($out);
于 2013-02-22T10:24:10.480 に答える