Изменить bbcode в зависимости от значения URL - PullRequest
0 голосов
/ 01 сентября 2011

Я использую preg_replace с массивом для просмотра моего bbcode и внесения изменений при публикации новостей.

Например,

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

Итак, когда я извлекаю данныеиз базы данных (в этом примере $ newsPost), которая содержит текст и bbcode, я делаю это.

$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 Ответ

1 голос
/ 01 сентября 2011

EDITED / FIXED

  • Добавлено str_replace() для работы с точками в доменных именах
  • Изначально я исправил обратную косую черту (если вы хотите буквальную обратную косую чертув вашем регулярном выражении это должно быть \\ в строке), но я отменил это, поскольку вы сказали, что в первую очередь это работает для вас.

Как насчет этого?

$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);
...