将逗号分隔的字符串转换为数组

10
我有一个逗号分隔的字符串,其中包含标签列表,想要将其转换为数组以获取每个标签的链接。
例如:
$string = 'html,css,php,mysql,javascript';

我想把它做成这样:

<a href="tag/html">html</a>, <a href="tag/css">css</a>, <a href="tag/php">php</a>, <a href="tag/mysql">mysql</a>, <a href="tag/javascript">javascript</a>
所以结果将是一个包含逗号分隔的链接字符串,每个链接后面有一个空格,并且最后一个链接后面没有逗号。
我有这个函数,其中$arg='html,css,php,mysql,javascript':
function info_get_tags( $arg ) {
    global $u;

    $tagss = '';
    if ( $arg == '' ) {
        return '';
    } else {
        $tags_arr = explode( ',' , $arg );
        foreach ( $tags_arr as $tag ) {
            $tags = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
            $tagss .= $tags;
        }

        return $tagss;
    }
}

这个脚本对我有效,但如果我们在这里添加逗号和空格:

$tags = '<a href="' . $u . 'tag/' . $tag . '/">' . $tag . '</a>, ';

我们会得到逗号和空格,但最后一个链接后面会有一个尾随逗号。

10个回答

17

像使用 explode 函数一样,您也可以再次使用 implode 函数:

$tags = explode(',', $arg);
foreach ($tags as &$tag) {
    $tag = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
}

return implode(', ', $tags);

1
这对我很有效,但您能告诉我$tag前面的&是什么意思吗? - med
2
@med:& 表示你通过引用进行迭代。这样,你可以修改 $tag,并且 $tags 数组中的元素也会被修改。 - NikiC
这是一个传递引用的运算符,这意味着它直接修改原始值而不是其副本。 - Narf
你应该总是foreach循环内部使用unset来取消引用刚刚被引用的变量:foreach ( $a as &$b ) { ... unset($b); } 这是PHP.net上的一种非常好的实践。 - Rudie

2

这里有一个替代方案,使用array_map而不是foreach循环:

global $u; 
function add_html($tag){
    return('<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag .  '</a>');
}
function get_tags($taglist){
    $tags_arr = array_map("add_html", explode( ',' , $taglist));
    return implode(", " , $tags_arr);
} 

1

尝试这个简短的代码

$string = 'html,css,php,mysql,javascript';

$string = explode(',', $string);
   foreach( $string as $link){
   echo '<a href="tag/'.$link.'">'.$link.'</a>';
}


0
最简单的方法是将HTML转换为数组(每个标签链接都是一个数组元素),然后在上进行合并。
if ( $arg == '' ) {

    return '';

} else {

    $tags_arr = explode( ',' , $arg );
    $tags  = array();
    $tagtpl = '<a href="%s" title="%s">%s</a>';

    foreach ( $tags_arr as $tag ) {
        $url = $u . 'tag/' . $tag . '/';
        $tags[] = sprintf($tagtpl, $url, $tag, $tag);

    }

    return implode(', ', $tags);

}

0

试试这个

$tagss = trim($tagss);    
return substr($tagss, 0 , strlen($tagss)-1);

你可以直接写 substr($tagss, 0, -2) ;) - NikiC
@nikic 没错,更快更好,但 rtrim 更棒。 - Igor

0
为什么不在创建标签时将所有标签放入一个数组中,然后在之后将数组分解并在标签之间添加逗号和空格。
foreach ( $tags_arr as $tag ) {
    $tags = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
    $tagss[] = $tags;
}
$tagss = explode(', ', $tagss);

0
function info_get_tags($arg)
{
    global $u;
    if (empty($arg)) return '';
    return ltrim(preg_replace('/([^\,]+)/', ' <a href="' . $u . '/${1}/" title="${1}">${1}</a>', $arg));
}

0

解决方法是先去除不需要的尾随字符:

$tagss = rtrim($tagss, ", ");

这个 rtrim 函数可以从字符串的右侧移除任何空格和逗号的组合。

顺便说一下,你也可以使用 str_getcsv 函数代替 explode 函数,它可以更好地处理输入中的空格。


0
$string = 'html,css,php,mysql,javascript';

puts $string.split(/,/).map { |tag| "<a href=\"tag/#{tag}\">#{tag}</a>"}.join(", ")

结果:

<a href="tag/html">html</a>, <a href="tag/css">css</a>, <a href="tag/php">php</a>, <a href="tag/mysql">mysql</a>, <a href="tag/javascript">javascript</a>

-3

另一种解决方案:

$html = trim(preg_replace('/([^,]+)/', ' <a href="/tags/\1" title="\1">\1</a>', $string));

或者,如果您需要对标签进行HTML编码(这总是明智的,因为您正在从文本创建HTML):

$html = trim(preg_replace_callback('/([^,]+)/', function($match) {
    $tag = $match[1];
    return ' <a href="/tags/' . urlencode($tag) . '" title="' . htmlspecialchars($tag) . '">' . htmlspecialchars($tag) . '</a>';
}, $string));

所以这个$string也可以工作:"tag with space,html,css,php,mysql,javascript"

更多的正则表达式总是好的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接