1

我有一个 php foreach 循环列出从 MySQL 中提取的新闻故事,作为循环的一部分,故事被打印出来,然后在查询运行以提取,然后显示附加到故事的任何图像。这是它的简化版本:

foreach ($res AS $row) { 
    printf('<p>%s</p>' . PHP_EOL, nl2br($row['story']));


    $qry3 = "select * from tpf_images where news_id=".$row['news_id'];
    $res3 = $pdo->query($qry3);


    foreach ($res3 AS $row3) { 

        printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );
    }
}

它工作正常,但意味着新闻故事的所有图像都在该故事之下。相反,我想要实现的是图像在每个段落的开头作为故事文本的一部分打印出来。故事是用打印出来的nl2br($row['story']),用nl2br一个段落是实现用的 <br /><br />。那么有没有办法让 php 进行扫描nl2br($row['story']),如果它发现<br /><br />插入了我用于图像 foreach 的文本:

printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

这样,图像将显示在文本正文中,而不是在正文下方。如果结果中的图像比<br /><br />之前的故事打印出来的其余图像多。

感谢您对此的任何帮助,因为我完全被难住了(另外,不确定标题应该是什么,以便可以根据需要进行编辑以更好地适应)

编辑:尝试使问题更清楚,nl2br($row['story'])请搜索<br /><br />. 如果发现它被替换为<br /><image><br />image 是我用来显示图像的代码,它是:

<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt']
4

3 回答 3

2

为什么不
直接添加到 printf 行?

printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a><br>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

或者更好的是,使用 css 对其进行样式设置,例如:

echo '<div class="images">';
foreach ($res3 AS $row3) { 

    printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
    <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

}
echo '</div>';

CSS:

div.images a { display: block; }

除非我完全误解了这个问题。

编辑::

看到您的新编辑,您需要改用 sprintf :

foreach ($res AS $row) { 
    $story = '<p>' . preg_replace("/\n|\n\r|\n\r/", '<br>', $row['story']) . '</p>' . PHP_EOL;


    $qry3 = "select * from tpf_images where news_id=".$row['news_id'];
    $res3 = $pdo->query($qry3);

    $images = '';
    foreach ($res3 AS $row3) { 
        $images .= sprintf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );
    }
    $story = preg_replace('/<br><br>/', '<br>' . $images . '</br>', $story);
}
于 2013-09-30T14:06:04.213 回答
0

用户2574794。你所要求的并不完全“清楚”。

顺便说一句,你为什么不使用一个简单的 str_replace()?就像是:

str_replace('<br /><br />', '<br /><br />blabla', nl2br($row['story']));
于 2013-09-30T14:05:29.587 回答
0

<br/>使用 str_replace( )函数来删除

删除中断行:

str_replace(array('<br>','<br/>','',strtolower($row['story'])))

将故事放在 a中,并将s 和s 向左<span>对齐。<span><img>

我建议你使用<li>s 因为它很容易设置样式(垂直和水平文本对齐)

于 2013-09-30T14:11:58.490 回答