function url_nettoyer($titre,$longueur_maxi,$longueur_min=0,$separateur='-',$filtre=''){
if (!defined('_TRANSLITTERER_URL')) define('_TRANSLITTERER_URL', true);
$titre = supprimer_tags(supprimer_numero(extraire_multi($titre)));
$url = corriger_caracteres($titre);
if (_TRANSLITTERER_URL) $url = translitteration($url);
if ($filtre)
$url = $filtre($url);
// on va convertir tous les caracteres de ponctuation et espaces
// a l'exception de l'underscore (_), car on veut le conserver dans l'url
$url = str_replace('_', chr(7), $url);
$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
$url = str_replace(chr(7), '_', $url);
// S'il reste trop de caracteres non latins, les gerer comme wikipedia
// avec rawurlencode :
if (_TRANSLITTERER_URL && preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) {
foreach ($r as $regs) {
$url = substr_replace($url, rawurlencode($regs[0]),
strpos($url, $regs[0]), strlen($regs[0]));
}
}
// S'il reste trop peu, renvoyer vide
if (strlen($url) < $longueur_min)
return '';
// Sinon couper les mots et les relier par des $separateur
if (_TRANSLITTERER_URL) $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url);
else $mots = preg_split(",[\s]+,", $url);
$url = '';
foreach ($mots as $mot) {
if (!strlen($mot)) continue;
$url2 = $url.$separateur.$mot;
// Si on depasse $longueur_maxi caracteres, s'arreter
// ne pas compter 3 caracteres pour %E9 mais un seul
$long = preg_replace(',%.,', '', $url2);
if (strlen($long) > $longueur_maxi) {
break;
}
$url = $url2;
}
$url = substr($url, 1);
// On enregistre en utf-8 dans la base
$url = rawurldecode($url);
if (strlen($url) < $longueur_min)
return '';
return $url;
}
/**
* Insertion dans le pipeline formulaire_charger (SPIP)
*
* Surcharge du sujet et le texte du message généré par le formulaire_ecrire_auteur
* Surcharge du formulaire d'inscription pour ne pas afficher l'explication
*
* @param array $flux
* @return array $flux
*/
function geol_formulaire_charger($flux)
{
// sujet perso pour formulaire_ecrire_auteur depuis une page article (erreur de localisation)
if ($flux['args']['form'] == 'ecrire_auteur' and $flux['args']['args'][1] != '') {
$flux['data']['sujet_message_auteur'] .= supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])) . " : " . _T('geol:sujet_erreur_localisation');
$flux['data']['texte_message_auteur'] .= _T('geol:depuis_page') . " : " . generer_url_entite_absolue($flux['args']['args'][1], 'article') . "\n\nMessage :\n\n";
}
// pas d'explicaltion sur le form d'inscription
if ($flux['args']['form'] == 'inscription' and $flux['args']['args'][0] == '1comite') {
$flux['data']['_commentaire'] = '';
}
// limiter le form de polyhierarchie sur la branche des categories (dans le public)
// cf http://zone.spip.org/trac/spip-zone/changeset/41280
if ($flux['args']['form'] == 'editer_polyhierarchie' and !test_espace_prive()) {
$flux['data']['limite_branche'] = lire_config('geol/secteur_categories', 2);
}
return $flux;
}
function formulaires_forum_charger_dist(
$titre, $table, $type, $script,
$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
$ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) {
// exiger l'authentification des posteurs pour les forums sur abo
if ($type == "abo") {
if (!$GLOBALS["visiteur_session"]['statut']) {
return array(
'action' => '', #ne sert pas dans ce cas, on la vide pour mutualiser le cache
'editable'=>false,
'login_forum_abo'=>' ',
'inscription' => generer_url_public('identifiants', 'lang='.$GLOBALS['spip_lang']),
'oubli' => generer_url_public('spip_pass','lang='.$GLOBALS['spip_lang'],true),
);
}
}
// Tableau des valeurs servant au calcul d'une signature de securite.
// Elles seront placees en Input Hidden pour que inc/forum_insert
// recalcule la meme chose et verifie l'identite des resultats.
// Donc ne pas changer la valeur de ce tableau entre le calcul de
// la signature et la fabrication des Hidden
// Faire attention aussi a 0 != ''
// id_rubrique est parfois passee pour les articles, on n'en veut pas
$ids = array();
if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
$id_rubrique = 0;
foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
$ids[$o] = ($x = intval($$o)) ? $x : '';
}
// ne pas mettre '', sinon le squelette n'affichera rien.
$previsu = ' ';
// au premier appel (pas de Post-var nommee "retour_forum")
// memoriser eventuellement l'URL de retour pour y revenir apres
// envoi du message ; aux appels suivants, reconduire la valeur.
// Initialiser aussi l'auteur
if ($retour_forum = rawurldecode(_request('retour')))
$retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
else {
// par defaut, on veut prendre url_forum(), mais elle ne sera connue
// qu'en sortie, on inscrit donc une valeur absurde ("!")
$retour_forum = "!";
// sauf si on a passe un parametre en argument (exemple : {#SELF})
if ($url_param_retour)
$retour_forum = str_replace('&', '&', $url_param_retour);
$retour_forum = rawurlencode($retour_forum);
}
if (_request('retour_forum')){
$arg = forum_fichier_tmp(join('', $ids));
$securiser_action = charger_fonction('securiser_action', 'inc');
// on sait que cette fonction est dans le fichier associe
$hash = calculer_action_auteur("ajout_forum-$arg");
}
// pour les hidden
$script_hidden = "";
foreach ($ids as $id => $v)
$script_hidden .= "<input type='hidden' name='$id' value='$v' />";
$script_hidden .= "<input type='hidden' name='arg' value='$arg' />";
$script_hidden .= "<input type='hidden' name='hash' value='$hash' />";
$script_hidden .= "<input type='hidden' name='verif_".substr($hash,0,32)."' value='ok' />";
$script_hidden .= "<input type='hidden' name='afficher_texte' value='$afficher_texte' />";
$script_hidden .= "<input type='hidden' name='retour_forum' value='$retour_forum' />";
// l'ajout de documents est-il autorise ?
// cf. verifier.php
if ($formats = forum_documents_acceptes()) {
include_spip('inc/securiser_action');
$cle_ajouter_document = calculer_cle_action('ajouter-document-'.join('-',array_map('intval',$ids)));
}
return array(
'modere' => (($type != 'pri') ? '' : ' '),
'nom_site' => '',
'table' => $table,
'texte' => '',
'config' => array('afficher_barre' => ($GLOBALS['meta']['forums_afficher_barre']!='non'?' ':'')),
'titre' => str_replace('~', ' ', extraire_multi($titre)),
'action' => $script, # ce sur quoi on fait le action='...'
'_hidden' => $script_hidden, # pour les variables hidden
'url_site' => "http://",
'cle_ajouter_document' => $cle_ajouter_document,
'formats_documents_forum' => $formats,
'ajouter_document' => $_FILES['ajouter_document']['name'],
'nobot' => _request('nobot'),
'ajouter_groupe' => $ajouter_groupe,
'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
'id_forum' => $id_forum, // passer id_forum au formulaire pour lui permettre d'afficher a quoi l'internaute repond
'_sign'=>implode('_',$ids)
);
}
开发者ID:rhertzog,项目名称:lcs,代码行数:98,代码来源:forum.php
示例11: cs_rempl_glossaire
function cs_rempl_glossaire($texte, $liste=false) {
global $gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id;
// si [!glossaire] est trouve on sort
if(strpos($texte, _CS_SANS_GLOSSAIRE)!==false)
return $liste?array():str_replace(_CS_SANS_GLOSSAIRE, '', $texte);
// mise en static de la table des mots pour eviter d'interrroger la base a chaque fois
// attention aux besoins de memoire...
static $limit, $glossaire_generer_url, $glossaire_generer_mot, $glossaire_array = NULL;
if(!isset($glossaire_array)) {
$glossaire_array = glossaire_query_tab();
$glossaire_generer_url = function_exists('glossaire_generer_url')?'glossaire_generer_url':'glossaire_generer_url_dist';
$limit = defined('_GLOSSAIRE_LIMITE')?_GLOSSAIRE_LIMITE:-1;
$glossaire_generer_mot = function_exists('glossaire_generer_mot')
?'glossaire_generer_mot(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])':'$GLOBALS[\'gloss_mots\'][\\1]'; // 'glossaire_generer_mot_dist(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])';
$glossaire_generer_mot = '"<a $table1[\\2]_".$GLOBALS["gl_i"]++."\' class=\'cs_glossaire\'><span class=\'gl_mot\'>".'.$glossaire_generer_mot.'."</span>$table2[\\2]</a>"';
}
$unicode = false;
$mem = $GLOBALS['toujours_paragrapher'];
$GLOBALS['toujours_paragrapher'] = false;
// initialisation des globales d'echappement
$gloss_ech = $gloss_mots = array();
$gloss_ech_id = $gloss_mots_id = 0;
// prudence 1 : protection des liens SPIP
if (strpos($texte, '[')!==false)
$texte = preg_replace_callback(',\[[^][]*->>?[^]]*\],msS', 'glossaire_echappe_balises_callback', $texte);
// parcours de tous les mots, sauf celui qui peut faire partie du contexte (par ex : /spip.php?mot5)
$mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot');
foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) {
// parser le mot-cle du glossaire
// contexte de langue a prendre en compte ici
list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre']));
$mot_present = false;
if(count($les_regexp)) {
// a chaque expression reconnue, on pose une balise temporaire cryptee
// ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i
$texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit);
// TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu
// et s'il faut construire la fenetre de glossaire.
// TODO 2 : decrementer le parametre $limit pour $les_mots, si &$count est renseigne.
// en attendant, constuisons qd meme la fenetre...
$mot_present = true;
}
if($les_mots) {
if(preg_match(",\W(?:$les_mots)\W,i", " $texte ")) {
$texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode);
$mot_present = true;
}
}
// si un mot est trouve, on construit la fenetre de glossaire
if($mot_present) {
$lien = $glossaire_generer_url($gloss_id, $titre);
// $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte'];
if($liste)
$table1[$gloss_id] = array($gloss_id, $lien, $les_titres);
else {
$table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons
$table2[$gloss_id] = recuperer_fond(
defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css',
array('id_mot' => $gloss_id, 'titre' => $les_titres,
'texte' => glossaire_safe($mot['texte']),
'descriptif' => glossaire_safe($mot['descriptif'])));
}
}
}
$GLOBALS['toujours_paragrapher'] = $mem;
$GLOBALS['gl_i'] = 0;
if($liste) $texte = (preg_match_all(',@@M(\d+)#(\d+)@@,', $texte, $reg, PREG_SET_ORDER)
&& array_walk($reg,
create_function('&$v,$k,&$t1', '$v=array_merge(array($GLOBALS[\'gloss_mots\'][$v[1]]),$t1[$v[2]]);'), $table1)
)?$reg:array();
else {
// remplacement des echappements
$texte = preg_replace(',@@E(\d+)@@,e', '$GLOBALS[\'gloss_ech\'][\\1]', $texte);
// remplacement final des balises posees ci-dessus
$texte = preg_replace(',@@M(\d+)#(\d+)@@,e', $glossaire_generer_mot, $texte);
}
// nettoyage
unset($gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id);
return $texte;
}
/**
* Récupérer les infos utiles des paquet
*
* Crée un tableau de description pour chaque paquet dans une
* écriture courte comme index ('i' pour identifiant) tel que :
* - i = identifiant
* - p = prefixe (en majuscule)
* - n = nom du plugin
* - v = version
* - e = etat
* - a = actif
* - du = dépendances utilise
* - dn = dépendances nécessite
* - dl = dépendances librairie
* - procure = prefixes procurés
* - maj = mise à jour
*
*
* On passe un where ($condition) et on crée deux tableaux, l'un des paquets
* triés par identifiant, l'autre par prefixe.
*
* @param array|string $condition
* Condition where
* @param bool $multiple
* Si multiple, le tableau par préfixe est un sous-tableau (il peut alors
* y avoir plusieurs paquets pour un même prefixe, classés par états décroissants)
* @return array
* Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description
* Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description
* ou, avec $multiple=true : [p][MOTS][] = tableau de description
*/
public function infos_courtes($condition, $multiple = false)
{
$plugs = array('i' => array(), 'p' => array());
$from = array('spip_paquets AS pa', 'spip_plugins AS pl');
$orderby = $multiple ? 'pa.etatnum DESC' : '';
$where = array('pa.id_plugin = pl.id_plugin');
if (is_array($condition)) {
$where = array_merge($where, $condition);
} else {
$where[] = $condition;
}
include_spip('inc/filtres');
// extraire_multi()
$res = sql_allfetsel(array('pa.id_paquet AS i', 'pl.nom AS n', 'pl.prefixe AS p', 'pa.version AS v', 'pa.etatnum AS e', 'pa.compatibilite_spip', 'pa.dependances', 'pa.procure', 'pa.id_depot', 'pa.maj_version AS maj', 'pa.actif AS a'), $from, $where, '', $orderby);
foreach ($res as $r) {
$r['p'] = strtoupper($r['p']);
// on s'assure du prefixe en majuscule.
// savoir si un paquet est en local ou non...
$r['local'] = $r['id_depot'] == 0 ? true : false;
unset($r['id_depot']);
$d = unserialize($r['dependances']);
// voir pour enregistrer en bdd simplement 'n' et 'u' (pas la peine d'encombrer)...
$deps = array('necessite' => array(array()), 'utilise' => array(array()), 'librairie' => array(array()));
if (!$d) {
$d = $deps;
}
unset($r['dependances']);
if (!$r['procure'] or !($proc = unserialize($r['procure']))) {
$proc = array();
}
$r['procure'] = $proc;
/*
* On extrait les multi sur le nom du plugin
*/
$r['n'] = extraire_multi($r['n']);
$plugs['i'][$r['i']] = $r;
// pour chaque type de dependences... (necessite, utilise, librairie)
// on cree un tableau unique [$dependence] = array()
// au lieu de plusieurs tableaux par version de spip
// en ne mettant dans 0 que ce qui concerne notre spip local
foreach ($deps as $cle => $defaut) {
if (!isset($d[$cle])) {
$d[$cle] = $defaut;
}
// gerer les dependences autres que dans 0 (communs ou local) !!!!
// il peut exister des cles info[dn]["[version_spip_min;version_spip_max]"] de dependences
if (!isset($d[$cle][0]) or count($d[$cle]) > 1) {
$dep = array();
$dep[0] = isset($d[$cle][0]) ? $d[$cle][0] : array();
unset($d[$cle][0]);
foreach ($d[$cle] as $version => $dependences) {
if (svp_verifier_compatibilite_spip($version)) {
$dep = array_merge($dep[0], $dependences);
}
}
$d[$cle] = $dep;
}
}
// passer les prefixes en majuscule
foreach ($d['necessite'][0] as $i => $n) {
$d['necessite'][0][$i]['nom'] = strtoupper($n['nom']);
}
$plugs['i'][$r['i']]['dn'] = $d['necessite'][0];
$plugs['i'][$r['i']]['du'] = $d['utilise'][0];
$plugs['i'][$r['i']]['dl'] = $d['librairie'][0];
if ($multiple) {
$plugs['p'][$r['p']][] =& $plugs['i'][$r['i']];
// alias
} else {
//.........这里部分代码省略.........
/**
* http://code.spip.net/@corriger_typo
*
* @param string $t
* @param string $lang
* @return string
*/
function corriger_typo($t, $lang = '')
{
static $typographie = array();
// Plus vite !
if (!$t) {
return $t;
}
$t = pipeline('pre_typo', $t);
// Caracteres de controle "illegaux"
$t = corriger_caracteres($t);
// Proteger les caracteres typographiques a l'interieur des tags html
if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) {
foreach ($regs as $reg) {
$insert = $reg[0];
// hack: on transforme les caracteres a proteger en les remplacant
// par des caracteres "illegaux". (cf corriger_caracteres())
$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
$t = str_replace($reg[0], $insert, $t);
}
}
// trouver les blocs multi et les traiter a part
$t = extraire_multi($e = $t, $lang, true);
$e = $e === $t;
// Charger & appliquer les fonctions de typographie
$idxl = "{$lang}:" . (isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang']);
if (!isset($typographie[$idxl])) {
$typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie');
}
$t = $typographie[$idxl]($t);
// Les citations en une autre langue, s'il y a lieu
if (!$e) {
$t = echappe_retour($t, 'multi');
}
// Retablir les caracteres proteges
$t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
// pipeline
$t = pipeline('post_typo', $t);
# un message pour abs_url - on est passe en mode texte
$GLOBALS['mode_abs_url'] = 'texte';
return $t;
}
开发者ID:genma,项目名称:spip_ynh,代码行数:48,代码来源:texte.php
示例15: spiplistes_meleuse
//.........这里部分代码省略.........
// prendre la premiere etiquette sur le tas et traiter son courrier
$sql_courrier_select = array(
'titre', 'texte', 'message_texte', 'type'
, 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi'
);
if($id_courrier =
intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide))
) {
$sql_courrier_a_traiter = spiplistes_courriers_casier_premier(
$sql_courrier_select
, 'id_courrier='.sql_quote($id_courrier)
);
spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier);
} else {
// un vieux bug dans une ancienne version, eradique depuis (j'espere ;-)
//spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !");
spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier'
, array('s' => $prefix_log))
);
}
// boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur
while($row = sql_fetch($sql_courrier_a_traiter)) {
foreach($sql_courrier_select as $key) {
$$key = $row[$key];
}
foreach(array('id_courrier','id_liste','total_abonnes') as $key) {
$$key = intval($$key);
}
// objet (subject) ne peut pas être en html ?!
// sauf pour le webmail (et encore)
$objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre))));
$page_html = stripslashes($texte);
$message_texte = stripslashes($message_texte);
$nb_emails = array();
// compteur pour la session uniquement
// le total de chaque sera ajoute en fin de session
$nb_emails_envoyes =
$nb_emails_echec =
$nb_emails_non_envoyes =
$nb_emails['texte'] =
$nb_emails['html'] = 0
;
$str_log = 'id_courrier #'.$id_courrier;
//////////////////////////
// Determiner email de l emetteur
if($is_a_test = email_valide($email_test)) {
// courrier a destination adresse email de test
$str_log .= ' TO: '.$email_test.' (TEST)';
}
else if($id_liste > 0) {
// courrier a destination des abonnes d'une liste
$total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);
$str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)';
$lang = spiplistes_listes_langue($id_liste);
if($lang != '') {
$GLOBALS['spip_lang'] = $lang;
}
/**
* Retourne un texte HTML présentant la liste des dépendances d'un plugin
*
* Des liens vers les plugins dépendants sont présents lorsque les plugins
* en dépendance sont connus dans notre base.
*
* @param string $balise_serialisee
* Informations des dépendances (tableau sérialisé) tel que stocké
* en base dans la table spip_paquets
* @param string $dependance
* Type de dépendances à afficher (necessite ou utilise).
* Une autre valeur indique qu'on demande la liste des librairies dépendantes.
* @param string $sep
* Séparateur entre les noms de dépendances
* @param string $lien
* Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs :
*
* - local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut
* donc que le site propose des pages publiques pour les plugins sinon une 404 sera affichée;
* - pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP;
* - non : aucun lien n'est affiché.
* @return string
* Texte informant des dépendances
**/
function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', $sep = '<br />', $lien = 'local')
{
$texte = '';
$t = unserialize($balise_serialisee);
$dependances = $t[$dependance];
if (is_array($dependances)) {
ksort($dependances);
foreach ($dependances as $_compatibilite => $_dependance) {
$compatibilite = $_compatibilite !== 0 ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP'))) : '';
if ($compatibilite) {
$texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite;
}
foreach ($_dependance as $_plugin) {
if ($texte) {
$texte .= $sep;
}
if ($dependance == 'necessite' or $dependance == 'utilise') {
if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom']))) {
$nom = extraire_multi($plugin['nom']);
if ($lien == 'non') {
$logiciel = $nom;
} else {
$url = $lien == 'local' ? generer_url_entite($plugin['id_plugin'], 'plugin') : "http://plugins.spip.net/{$_plugin['nom']}.html";
$bulle = _T('svp:bulle_aller_plugin');
$logiciel = '<a href="' . $url . '" title="' . $bulle . '">' . $nom . '</a>';
}
} else {
// Cas ou le plugin n'est pas encore dans la base SVP.
// On affiche son préfixe, cependant ce n'est pas un affichage devant perdurer
$logiciel = $_plugin['nom'];
}
$intervalle = '';
if (isset($_plugin['compatibilite'])) {
$intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel);
}
$texte .= $intervalle ? $intervalle : $logiciel;
} else {
// On demande l'affichage des librairies
$texte .= '<a href="' . $_plugin['lien'] . '" title="' . _T('svp:bulle_telecharger_librairie') . '">' . $_plugin['nom'] . '</a>';
}
}
}
}
return $texte;
}
请发表评论