将多个链接添加到给定分隔符的字符串

时间:2013-03-15 15:05:02

标签: php

A有一个与此类似的字符串

$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';

@表示标记的单词存在,类型和main_id。我的目标是链接标记的单词,如下所示:

<a href="/user.php?id=529">@Carlos</a> is going to rock <a href="/city.php?id=111">@NEW YORK</a>

一旦打印出来,卡洛斯和纽约的链接将如下所示

  @Carlos将摇滚@NEW YORK

使用substr_count我将能够知道有多少标签。我有一个函数来获取两个分隔符之间的字符串

function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);

我坚持如何处理这个问题,任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

使用正则表达式(preg_match / preg_match_all / preg_replace)。示例代码:

<?php
$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';

print preg_replace('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', '<a href="/\2.php?id=\3">@\1</a>', $string);

?>

但是为了安全起见,你可能想要使用preg_replace_callback来为标签做一些htmlspecialchars()。以及类型上的urlencode()。像这样:

function tag2url($matches) {
  $tag = $matches[1];
  $type = $matches[2];
  $id = $matches[3];
  return '<a href="/' . urlencode($type) . '.php?id=' . urlencode($id) . '">' . htmlspecialchars($tag) . '</a>';
}

print preg_replace_callback('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', "tag2url", $string);

答案 1 :(得分:0)

您的数据格式不错,非常适合正则表达式。

我会使用一个看起来像这样的人:

/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/

这会查找@个符号,然后是[<words>],然后是({<word>}:<number>)

然后,您可以使用preg_replace一次性替换带有链接的字符串。

$string = '@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';
$regex = '/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/';

$newString = preg_replace($regex, '<a href="/$2.php?id=$3">@$1</a>', $string);

DEMO:http://ideone.com/EYf4KR