0

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 的链接

@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);

我被困在如何解决这个问题上,任何建议都会有所帮助。

4

2 回答 2

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);
于 2013-03-15T15:08:22.450 回答
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);

演示:http: //ideone.com/EYf4KR

于 2013-03-15T15:20:49.420 回答