Преобразование разделенной запятыми строки в массив

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

Пример:

$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>, '; 

мы получаем запятые и пробелы, но после последней ссылки будет конечная запятая.

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

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

Вот альтернатива, которая использует 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); } 

Самый простой способ заключается в том, чтобы 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); } 

Попробуй это

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

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

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

Обходной путь (!) Состоял бы в том, чтобы удалить нежелательные конечные символы:

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

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

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

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

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

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

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

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

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

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

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