我在preg_replace上做错了什么?

时间:2013-09-22 17:27:04

标签: php preg-replace

我已经和他斗争了好几天了。我试图让我的preg_replaces工作。 我从数据库中获取数据以使用preg-replace并将它们绑定到变量。 $post_preview就是其中之一。

<?php
    $body_sub = substr($post_preview, 0) . "<br><br><a href='post.php?id=$post_id'> Continue Reading →</a>";
    echo nl2br($body_sub); ?></p>
            <?php
    //bold
        $post_preview = preg_replace('/(\[bold\])/', '<strong>', $post_preview);
        $post_preview = preg_replace('/(\[\/bold\])/', '</strong>', $post_preview);
        echo '[bold]Test[/bold]';
    //italic
        $post_preview = preg_replace('/(\[i\])/', '<i>', $post_preview);
        $post_preview = preg_replace('/(\[\/i\])/', '</i>', $post_preview);

这不会取代[i][bold],也不会取代[/i][/bold]。即使使用E_ALL也没有错误。我做错了什么,如何解决?

2 个答案:

答案 0 :(得分:1)

<?php
//bold
$post_preview = preg_replace('/\[bold\]/', '<strong>', $post_preview);
$post_preview = preg_replace('/\[\/bold\]/', '</strong>', $post_preview);
//italic
$post_preview = preg_replace('/\[i\]/', '<i>', $post_preview);
$post_preview = preg_replace('/\[\/i\]/', '</i>', $post_preview);

echo $post_preview;
?>

这应该这样做。我想知道你为什么要为这些使用正则表达式。如果你在这种情况下使用str_replace会不会更容易?

答案 1 :(得分:0)

你的正则表达式有太多括号(参见n0tiz'帖子)。然而,这可以大大简化。首先,我建议对一个标签使用一个正则表达式,而不是两个。这可以通过像(.*)?含义的通配符轻松完成:

既然你的操作没有任何参数,在下一部分中由于两个操作都是相同的,所以它们应该进入一个循环,所以代码只需要写一次。

$text = "[bold]hello this [i]is a test[/bold][bold]i[/i]";

$html_tags = array(
    "bold" => "strong",
    "i" => "em",
);

foreach ($html_tags as $code=>$tag)
    $text = preg_replace("/\[$code\](.*)?\[\/$code]/i", "<$tag>$1</$tag>", $text);

使用一个正则表达式的优点是错误的代码不会创建错误的HTML。