根据网址值更改bbcode

时间:2011-09-01 09:38:42

标签: php preg-replace bbcode

我正在使用带有数组的preg_replace来浏览我的bbcode并在发布新闻条目时进行更改。

例如

$bbcode = array (
    "/\[url\=(.*?)\](.*?)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>"
);

那么当我从包含文本和bbcode的数据库(在本例中为$ newsPost)中提取数据时,我就这样做了。

$newsPost  = preg_replace(array_keys($bbcode), array_values($bbcode), $newsPost);

现在,我想要知道$ 1的值是否包含我的域名,目标应该是“top”,如果不是,那么它应该是空白的。

所以,如果我们有[url=http://www.mydomain.com]visit our page[/url]。然后它转换为<a href="http://www.mydomain.com" target="top">visit our page</a>,其他任何内容都会target="_blank"

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

已编辑/已修复

  • 添加了str_replace()来处理域名中的点
  • 最初我修复了你的反斜杠(如果你想要你的正则表达式中的文字反斜杠,它应该是字符串中的\\)但是我已经撤消了,因为你说它首先在为你工作。< / LI>

这个怎么样?

$mydomain = 'domain.tld';
$bbcode = array (
  "/\[url\=([^]]*)(".str_replace('.','\\.',$mydomain).")([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$4</a>",
  "/\[url\]([^[]*)(".str_replace('.','\\.',$mydomain).")([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$1$2$3</a>";
  "/\[url\=([^]]*)\]([^[]*)\[\/url]/is" => "<a href='$1' target='_blank'>$2</a>"
  "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>",
);

如果这对您有用,请注意:不要将$mydomain设置为www.domain.tld,将其设置为domain.tld,以便捕获所有子域。

您甚至可以使用以下多个域来执行此操作:

$mydomains = array(
  'domain.tld',
  'anotherdomain.tld',
  'sub.yetanotherdomain.tld'
);

// Add domain-specific rules before general rules so we don't match domain
// specific links with the general link rule (we have replaced them by that point)
$domainrules = array();
foreach ($mydomains as $domain) {
  $domainrules["/\[url\=([^]]*)(".str_replace('.','\\.',$domain).")([^]]*)\]([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$4</a>";
  $domainrules["/\[url\]([^[]*)(".str_replace('.','\\.',$domain).")([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$1$2$3</a>";
}

// This array contains all your static BBCode rules
$staticrules = array(
  "/\[url\=([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>",
  "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>",
  "/\[b\]([^[]*)\[\/b\]/is" => "<span class='bold_text'>$1</span>",
  ...
);

// Make an array that contains all the rules
$bbcode = array_merge($staticrules,$domainrules);