0
$item_content = '<p>'. str_replace('\n\n', '</p><p>', $item_content) .'</p>'; 

<?php
    $item_content = '<img class="attachment-frontpage-smallthumb wp-post-image" width="140" height="80" title="Screen shot 2013-10-25 at 11.55.11 AM" alt="Screen shot 2013-10-25 at 11.55.11 AM" src="http://media.gizmodo.co.uk/wp-content/uploads/2013/10/Screen-shot-2013-10-25-at-11.55.11-AM.png">
        How do you revive the Sh*t Girls Say meme that’s dead not only because we all grew tired of it, but because YouTube productivity assassins (aka movie makers) simply ran out of different types of people to make fun of? You reverse it and switch it into shit people would NEVER say. Like nerds thinking [...]
        <img width="1" height="1" border="0" src="http://gizmodo.feedsportal.com/c/34920/f/644110/s/32e94f6a/sc/1/mf.gif">
        <br clear="all">';
    ?>

我正在尝试分隔文本,以便文本将用<p>标签包裹,但str_replace我得到的包裹我的整个字符串,包括图像<p>

4

2 回答 2

0

那种东西str_replace在这里是没有用的。你应该知道你的任务不是很好。HTML 标记的一些微小变化,甚至空格字符的类型(换行符与否)都会导致以前工作的解决方案不正确。

如果您愿意换行的文本内容始终位于单独的行中,并且所有其他行都以标记开头(如您当前的示例中),您可以尝试使用如下逻辑:

function wrapTextLines( $content, $whichTag='p' ) {
    $output = '';
    foreach( explode("\n",$content) as $line ) {
        $line = trim($line);
        if( $line[0]!='<' )
            $output .= "<{$whichTag}>{$line}</{$whichTag}>\n";
        else
            $output .= "{$line}\n";
    }
    return $output;
}

这是在 PHPfiddle 中

或者另一个尝试是这个正则表达式,它将转换给定的 HTML 代码,将每个文本节点(标签之间的文本,包含除空格之外的内容)包装到<p>标签中。

$wrapped_content = preg_replace( 
    '#>\s*([^\s<][^<]+)<#ms', 
    '><p>$1</p><', 
    $item_content 
);

这是在 PHPfiddle 中

或者,更具体地说,将包装<img>标记后的每个文本节点。

$wrapped_content = preg_replace( 
    '#(<img[^>]+>)\s*([^\s<][^<]+)<#ims', 
    '$1<p>$2</p><', 
    $item_content 
);

这是在 PHPfiddle 中

于 2013-10-25T17:43:18.397 回答
0

如果你使用会发生什么:

$p_pos = strpos($item_content, '<p>');
$item_content = substr($item_content, 0, $p_pos) . '<p>'. str_replace('\n', '</p>', str_replace('\n', '<p>', substr($item_content, $p_pos)) .'</p>'; 

那可能会解决你的问题。

于 2013-10-25T15:27:26.773 回答