使用函数preg_replace将句点替换为段落

时间:2016-05-04 22:34:11

标签: php string wordpress str-replace

我的WP帖子里有很多未格式化的文字;我试图使用这段代码:

function user_content_replace($content) {
    return str_replace('.','.</p><p>',$content);
}
add_filter('the_content','user_content_replace', 99);

所以实际上我想用PARAGRAPH和PERIOD(.</p><p>)替换PERIOD

但我需要一点帮助:首先 - 这个代码取代了每一个点,所以我所有的永久链接,图像路径等都被DOT取代而且这很糟糕,在这种情况下,web根本不起作用。< / p>

所以,我认为替换每一个DOT的解决方案对我来说都是拯救,所以不是每个DOT。

有什么想法吗?

感谢名单

编辑:

我更改了上面的代码并编辑了wp-includes文件夹中的核心post-template.php文件:

function the_content( $more_link_text = null, $strip_teaser = false) {
    $content = get_the_content( $more_link_text, $strip_teaser );
    $content = apply_filters( 'the_content', $content );
    $content = preg_replace('/([^\\.]*\\.[^\\.]*\\.[^\\.]*){1}\\.([^\\.]*)/s', '$1.</p><p>$2',$content);
    echo $content;
}

现在还可以,大部分文字都是语法正确的,现在问题是上面的表情改变了图像路径,所以反而 something.com/wp-content/image.jpg 我有 - something.com/wp-content/image。

jpg

有关于此的任何想法?

注意:

嗯,代码昨天有效,但今天不起作用。代码中没有任何更改,但它不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

  

我需要更换每个第三个DOT,这都是

代码示例:

$content = "first.sec\nond.third.fourth.fifth>.sixth].seventh.";
$replacement = '$1.</p><p>$2';
echo preg_replace("/([^\\.]*\\.[^\\.]*\\.[^\\.]*){1}\\.([^\\.]*)/s", $replacement, $content);
echo "\n";

输出上述代码:

first.sec
ond.third.</p><p>fourth.fifth>.sixth].</p><p>seventh.

答案 1 :(得分:1)

您可以通过一些手动字符串迭代轻松完成此操作:

$text = 'text.with.dots.text.with.dots.text.with.dots';
function user_content_replace($content) {
    $str_parts = explode('.', $content);
    $result = '<p>';
    for ($i = 0; $i < count($str_parts); $i++) {
      $result .= $str_parts[$i];
      if (($i + 1) % 3 === 0)
          $result .= '.</p><p>';
      else
          $result .= '.';
    }
    $result .= '</p>';
    return $result;
}

然而,正如评论所指出的,这很难准确(例如,如果忘记了一个点)。这就是为什么短代码很受欢迎的原因,也就是因为使用这些短代码更准确地操作字符串内容,当用作边界时也是如此。例如,你可以这样做:

$better = '[myTag]text.with.dots[/myTag][myTag]text.with.dots[/myTag][myTag]text.with.dots[/myTag]';
function user_content_replace2($content) {
    $result = preg_replace('/\[myTag\]/', '<p>', $content);
    $result = preg_replace('/\[\/myTag\]/', '</p>', $result);
    return $result;
}

答案 2 :(得分:0)

这是对我的问题的正确和有效的答案:

function user_content_replace($content) {

$sentences_per_paragraph = 3; // settings

$pattern = '~(?<=[.?!…])\s+~'; // some punctuation and trailing space(s)

$sentences_array = preg_split($pattern, $content, -1, PREG_SPLIT_NO_EMPTY); // get sentences into array

$sentences_count = count($sentences_array); // count sentences

$output = ''; // new content init

// see PHP modulus
for($i = 0; $i < $sentences_count; $i++) {
    if($i%$sentences_per_paragraph == 0 && $i == 0) { //divisible by settings and is first
        $output .= "<p>" . $sentences_array[$i] . ' '; // add paragraph and the first sentence
    } elseif($i%$sentences_per_paragraph == 0 && $i > 0) { //divisible by settings and not first
        $output .= "</p><p>" . $sentences_array[$i] . ' '; // close and open paragraph, add the first sentence
    } else {
        $output .= $sentences_array[$i] . ' '; // concatenate other sentences
    }
}

$output .= "</p>"; // close the last paragraph

echo $output;
}
add_filter('the_content','user_content_replace', 99);

以上答案仅是部分答案,不适合WordPress代码层次结构。他们也导致图像URL问题,我不建议在我的问题中解释问题的方法。感谢大家的帮助。