У меня есть строка с разделителями-запятыми, которая состоит из списка тегов и хочет преобразовать ее в массив, чтобы получить ссылку для каждого тега.
Пример:
$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"
Больше регулярного выражения всегда хорошо!