Преобразовать строку через запятую в массив - PullRequest
10 голосов
/ 01 мая 2011

У меня есть строка, разделенная запятыми, которая состоит из списка тегов, и я хочу преобразовать ее в массив, чтобы получить ссылку для каждого тега.

Пример:

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

Iхочу сделать это так:

<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 ]

16 голосов
/ 01 мая 2011

Так же, как и вы explode d, вы можете implode снова:

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

return implode(', ', $tags);
2 голосов
/ 01 мая 2011

Вот альтернатива, которая использует 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 голос
/ 19 августа 2015

Попробуйте этот короткий код

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

$ string = explode (',', $ string);foreach ($ string как $ link) {эхо '<a href="tag/'.$link.'">'.$link.'</a>';}

0 голосов
/ 25 марта 2016
$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>
0 голосов
/ 01 мая 2011

Другое решение:

$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"

Больше регулярных выражений - это всегда хорошо!

0 голосов
/ 01 мая 2011
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 голосов
/ 01 мая 2011

Обходной путь (!) Должен был бы впоследствии удалить нежелательные завершающие символы:

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

Этот rtrim удаляет любое сочетание пробелов и запятыхот правого конца строки.

Кстати, вы можете использовать str_getcsv вместо разнесения, что также лучше обрабатывает вводимые пространства.

0 голосов
/ 01 мая 2011

Почему бы не поместить все теги в массив при их создании, а затем разбить массив и добавить запятые и пробелы между тегами.

foreach ( $tags_arr as $tag ) {
    $tags = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
    $tagss[] = $tags;
}
$tagss = explode(', ', $tagss);
0 голосов
/ 01 мая 2011

Попробуйте это

$tagss = trim($tagss);    
return substr($tagss, 0 , strlen($tagss)-1);
0 голосов
/ 01 мая 2011

Самый простой способ - добавить 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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...