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);
我坚持如何处理这个问题,任何建议都会有所帮助。
答案 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);