我有一个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']
答案 0 :(得分:2)
为什么不直接将print添加到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);
}
答案 1 :(得分:0)
user2574794。 你要求的并不完全“清楚”。
顺便说一下,为什么不使用简单的str_replace()? 类似的东西:str_replace('<br /><br />', '<br /><br />blabla', nl2br($row['story']));
答案 2 :(得分:0)
使用str_replace()函数删除<br/>
的
删除中断行:
str_replace(array('<br>','<br/>','',strtolower($row['story'])))
将故事放在<span>
内,并将<span>
和<img>
左侧文字对齐。
我建议您使用<li>
,因为它很容易设计样式(垂直和水平文本对齐)