0

preg_replace用来从$content某些中删除<img>

$content=preg_replace('/(?!<img.+?id="img_menu".*?\/>)(?!<img.+?id="featured_img".*?\/>)<img.+?\/>/','',$content);

当我现在使用 wordpress the_content 函数显示内容时,我确实<img>从以下位置删除了 s $content

我想事先获取这些图像以将它们放置在模板中的其他位置。我正在使用相同的正则表达式模式preg_match_all

preg_match_all('/(?!<img.+?id="img_menu".*?\/>)(?!<img.+?id="featured_img".*?\/>)<img.+?\/>/', $content, $matches);

但是我不能得到我的imgs?

preg_match_all('/(?!<img.+?id="img_menu".*?\/>)(?!<img.+?id="featured_img".*?\/>)<img.+?\/>/', $content, $matches);

print_r($matches);

Array ( [0] => Array ( ) ) 
4

2 回答 2

1

假设并希望您使用的是 php5,这是 DOMDocument 和 xpath 的任务。带有 html 元素的正则表达式大部分都可以工作,但请查看以下示例

<img alt=">" src="/path.jpg" />

正则表达式将失败。由于在编程中没有太多保证,因此请保证 xpath 会以性能成本准确找到您想要的东西,因此对其进行编码:

$doc = new DOMDocument();
$doc->loadHTML('<span><img src="com.png" /><img src="com2.png" /></span>');
$xpath = new DOMXPath($doc);
$imgs = $xpath->query('//span/img');
$html = '';
foreach($imgs as $img){
  $html .= $doc->saveXML($img);
}

现在你已经拥有了所有的 img 元素$html,用来str_replace()从中删除它们$content,然后你可以从那里喝一杯,很高兴带有 html 元素的 xpath 是无痛的,只是慢了一点

附言。我懒得理解你的正则表达式,我只是认为 xpath 在你的情况下更好

于 2013-09-26T12:36:25.853 回答
0

最后我使用了 preg_replace_callback:

$content2 = get_the_content();                    
$removed_imgs = array();                 
$content2 = preg_replace_callback('#(?!<img.+?id="featured_img".*?\/>)(<img.+? />)#',function($r) {
                    global $removed_imgs;
                    $removed_imgs[] = $r[1];
                    return '';
                },$content2);


 foreach($removed_imgs as $img){
                echo $img;
             }
于 2013-09-30T14:53:26.730 回答