[RESOLU] Utilisation de la methode PHP str_replace

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Utilisation de la methode PHP str_replace

Re: Utilisation de la methode PHP str_replace

par Saian » 08 mai 2015, 10:57

Au plaisir LylouBeta, j'espère que c'est plus clair pour toi maintenant. :)
Tu avais une bonne idée de départ, il te manque juste un peu de pratique pour mettre ça en application sans anicroche. ;)

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 08 mai 2015, 09:44

Merci beaucoup pour les explications Saian.
Effectivement quelque chose m'a echappé :-)
Je te remercie encore ;-)

Re: Utilisation de la methode PHP str_replace

par Saian » 07 mai 2015, 12:21

Je crois qu'il y a quelque chose qui t'échappe. ;)

Si je comprends bien ton problème, $link[6]['event_tks_twitter'] contient une chaîne de la forme https://twitter.com/#!/dourfestival

Partant de ce postulat (ne pas oublier le / à la fin ici '#!/') :
$find = array('http://', 'https://', 'twitter.com/', 'intent/user?screen_name=', '#!/');
$twitter = '@'.str_replace($find, '', $link[6]['event_tks_twitter']);
echo $twitter; // @dourfestival
Pour le code d'@rthur si $link[6]['event_tks_twitter'] contient une chaîne de la forme http://twitter.com/#!/dourfestival (tu remarqueras c'est http pas https sinon il faut adapter le pattern en fonction, en mettant par exemple (http|https) à la place de http, soit "`^(http|https):// dans les preg_match pour prendre en compte les deux possibilités)

Partant de ce postulat :
$twitter = url2pseudo_twitter($link[6]['event_tks_twitter']);
echo $twitter; // @dourfestival
EDIT
Comprend bien que quand tu fais :
$find = array('http://', 'https://', 'twitter.com/', 'intent/user?screen_name=', '#!');
str_replace($find, '@' ,'https://twitter.com/#!/dourfestival')
Chaque occurence de $find trouvée va être remplacé par @.
Donc https:// est remplacé par @ puis twitter.com/ est remplacé par @ puis #! est remplacé par @.
Il en résulte donc @@@/dourfestival

Et sinon pour le syntax error, unexpected '"@"'
.' '"@".str_replace($find, '' ,$link[6]['event_tks_twitter'])
Il y a bien une erreur de syntaxe ici .' '"@".
Ce devrait être .' '."@". ou plus simplement .' @'.

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 07 mai 2015, 12:12

avec ce code :
$find = array('http://', 'https://', 'twitter.com/', 'intent/user?screen_name=', '#!');
$data['text'] = '['.$link[6]['event_tks_type'].']'.' '.$link[6]['metrics_tks_number'].' '.$link[6]['metrics_tks_name'].' '.substr($link[6]['event_tks_concept'], 0, -189).' '.str_replace($find, '@' ,$link[6]['event_tks_twitter']).' '."#".$link[6]['event_tks_category']";
J'ai ceci : [Festival] 183000 Spectators @@@/dourfestival #Culture

avec ce code :
$find = array('http://', 'https://', 'twitter.com/', 'intent/user?screen_name=', '#!');
$data['text'] = '['.$link[6]['event_tks_type'].']'.' '.$link[6]['metrics_tks_number'].' '.$link[6]['metrics_tks_name'].' '.substr($link[6]['event_tks_concept'], 0, -189).' '"@".str_replace($find, '' ,$link[6]['event_tks_twitter']).' '."#".$link[6]['event_tks_category']." http://www.eventguru.be ";
syntax error, unexpected '"@"'

Re: Utilisation de la methode PHP str_replace

par Saian » 07 mai 2015, 11:46

Euh http et https ? tu vois pas une différence ? et c'est pareil pour ton idée de tableau.

EDIT
$search = array('http://', 'https://', 'twitter.com/', 'intent/user?screen_name=', '#!/');
echo '@'.str_replace($search, '', 'https://twitter.com/#!/dourfestival');
echo '@'.str_replace($search, '', 'https://twitter.com/intent/user?screen_name=dourfestival');
echo '@'.str_replace($search, '', 'http://twitter.com/#!/dourfestival');
echo '@'.str_replace($search, '', 'http://twitter.com/phpdebutant');
// etc

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 07 mai 2015, 11:40

@rthur

Isolé, ton code fonctionne.
Sur mon projet, cela ne fonctionne pas car mon lien à spliter est issu d'une requête
$sqlReq = $db->prepare("SELECT event_tks_twitter, event_tks_type, event_tks_category, event_tks_concept, metrics_tks_name, metrics_tks_number
FROM vtiger_event
JOIN vtiger_metrics vm ON eventid = metrics_tks_event
JOIN vtiger_metricscf vmc ON vm.metricsid = vmc.metricsid
JOIN vtiger_crmentity ON eventid = crmid
WHERE deleted =0
LIMIT 20");

$sqlReq->setFetchMode(PDO::FETCH_ASSOC); 
$sqlReq->execute();
$link = $sqlReq->fetchAll();

function url2pseudo_twitter($url) {
	if (preg_match("`^http://twitter\.com/intent/user\?screen_name=([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}elseif (preg_match("`^http://twitter\.com/#!/([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}elseif (preg_match("`^http://twitter\.com/([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}else{
		return false;
	}
}

/* Pour tester */
var_dump(url2pseudo_twitter("http://twitter.com/intent/user?screen_name=").$link[6]['event_tks_twitter']);
var_dump(url2pseudo_twitter("http://twitter.com/#!/").$link[6]['event_tks_twitter']);
var_dump(url2pseudo_twitter("http://twitter.com/").$link[6]['event_tks_twitter']);
var_dump(url2pseudo_twitter("http://tweetter.com/").$link[6]['event_tks_twitter']); // url incorrecte => doit renvoyer false
OUTPUT :

string(35) "https://twitter.com/#!/dourfestival" string(35) "https://twitter.com/#!/dourfestival" string(35) "https://twitter.com/#!/dourfestival" string(35) "https://twitter.com/#!/dourfestival"

Du coup la fonction ne fonctionne pas sur mon champ $link[6]['event_tks_twitter'].. J'ai peut être une erreur de syntaxe...

Re: Utilisation de la methode PHP str_replace

par @rthur » 07 mai 2015, 11:09

Le code de @rthur ne fonctionne pas de mon côté
C'est à dire ?
Que se passe-t-il, quel est le message d'erreur ?

Car j'ai vérifié et il fonctionne pourtant correctement. Tu as essayé de le mettre tout seul tel quel dans un fichier PHP et voir si il renvoyait les bonnes infos ?

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 07 mai 2015, 09:27

Ce que je ne saisis pas c'est que j'y arrive avec un élément mais pas plusieurs éléments comme ceci :

$find = 'https://twitter.com/#!/';
$data['text'] = $link[13]['event_tks_eventname'].' '.str_replace($find, '@', $link[13]['event_tks_twitter']);

Et là ça fonctionne mais ce n'est qu'avec un élément :/

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 07 mai 2015, 09:20

Le code de @rthur ne fonctionne pas de mon côté, j'espère pas que c'est une erreur de syntaxe :/ ...
Lorsque je reprends mon idée de départ:
$linkTwitter = array(
  'http://twitter.com/intent/user?screen_name=',
  'http://twitter.com/#!',
  'http://twitter.com/'
);

$data['text'] = $link[13]['event_tks_eventname'].' '.str_replace($linkTwitter, '@', $link[13]['event_tks_twitter']);
Aucun remplacement s'opère ....

Re: Utilisation de la methode PHP str_replace

par Saian » 06 mai 2015, 15:25

Salut, je pense que ta première idée est viable à condition de donner le bon paramètre au str_replace et en mettant un ordre adéquat aux chaines à remplacer.
$linkTwitter = array('twitter_url' => array());
$linkTwitter['twitter_url'][] = 'http://twitter.com/intent/user?screen_name=';
$linkTwitter['twitter_url'][] = 'http://twitter.com/#!';
$linkTwitter['twitter_url'][] = 'http://twitter.com/';

$data['text'] = $link['event_tks_eventname'].' '.str_replace($linkTwitter['twitter_url'], '@', $link['event_tks_twitter']);
ou (plus succinct)
$linkTwitter = array(
  'http://twitter.com/intent/user?screen_name=',
  'http://twitter.com/#!',
  'http://twitter.com/'
);

$data['text'] = $link['event_tks_eventname'].' '.str_replace($linkTwitter, '@', $link['event_tks_twitter']);
Sinon le code de @rthur est très bien aussi.

Re: Utilisation de la methode PHP str_replace

par @rthur » 06 mai 2015, 14:56

Bonjour,

Il faut que tu traites chaque cas un par un, voici une fonction que j'ai créée avec pour chacun une expression régulière :
<?php
function url2pseudo_twitter($url) {
	if (preg_match("`^http://twitter\.com/intent/user\?screen_name=([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}elseif (preg_match("`^http://twitter\.com/#!/([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}elseif (preg_match("`^http://twitter\.com/([a-z0-9_]+)$`i", $url, $matches)) {
		return "@".$matches[1];
	}else{
		return false;
	}
}


/* Pour tester */
var_dump(url2pseudo_twitter("http://twitter.com/intent/user?screen_name=phpfrance"));
var_dump(url2pseudo_twitter("http://twitter.com/#!/phpfrance"));
var_dump(url2pseudo_twitter("http://twitter.com/phpfrance"));
var_dump(url2pseudo_twitter("http://tweetter.com/phpfrance")); // url incorrecte => doit renvoyer false

Re: Utilisation de la methode PHP str_replace

par LylouBeta » 06 mai 2015, 13:11

ça ne fonctionne pas :/

Re: Utilisation de la methode PHP str_replace

par tof73 » 06 mai 2015, 12:57

si le but est de récupérer le nom de la page, faut-il vraiment faire quelque chose pour des urls qui ne contiennent pas le nom de la page ?

sinon oui un :
foreach($linkTwitter['twitter_url'] as $t){
$data['text'] = $link['event_tks_eventname'].' '.str_replace($t,'@',$link['event_tks_twitter']);
}

Utilisation de la methode PHP str_replace

par LylouBeta » 06 mai 2015, 11:49

Bonjour,

Je sais que pour remplacer un morceau de chaine de caractères, il faut utiliser la méthode str_replace.

Jusque là tout va bien lorsque je fias ceci :

Dans ma BDD, j'ai le champ ['event_tks_twitter'] avec le VARCHAR suivant : http://twitter.com/phpdebutant.

Pour récupérer le pseudo Twitter, j'utilise un str_replace (search, replace, subject) sur ce VARCHAR :
$data['text'] = $link['event_tks_eventname'].' '[b]str_replace('http://twitter.com/','@',$event['event_tks_twitter'])[/b];
Dans ma BDD, j'ai plusieurs variantes :

http://twitter.com/
http://twitter.com/#!/
http://twitter.com/intent/user?screen_name=

Comment faire pour que ma syntaxe puisse prendre en compte toutes les possibilités qu'il rencontrera dans ma BDD ?
Est-ce que je dois faire un tableau avec toutes ces possibilités, faire un foreach sur ce tableau puis utiliser la variable du foreach dans la méthode str_replace ?

Exemple :
$linkTwitter = array('twitter_url' => array());
$linkTwitter['twitter_url'][] = 'http://twitter.com/intent/user?screen_name=';
$linkTwitter['twitter_url'][] = 'http://twitter.com/';
$linkTwitter['twitter_url'][] = 'http://twitter.com/#!';

$data['text'] = $link['event_tks_eventname'].' '.str_replace($linkTwitter,'@',$link['event_tks_twitter']);
Merci pour l'aide :wink: