我已经和他斗争了好几天了。我试图让我的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
也没有错误。我做错了什么,如何解决?
答案 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'帖子)。然而,这可以大大简化。首先,我建议对一个标签使用一个正则表达式,而不是两个。这可以通过像(.*)?
含义的通配符轻松完成:
(
新组开始.
每个角色*
0次或更多次)
小组结尾?
不要贪婪(What do lazy and greedy mean in the context of regular expressions?)既然你的操作没有任何参数,在下一部分中由于两个操作都是相同的,所以它们应该进入一个循环,所以代码只需要写一次。
$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。