2009-03-06 9 views
1

Okay donc j'ai mis en place cette chose afin que je puisse imprimer la page que les gens venaient, et ensuite mettre des étiquettes factices sur certaines pages. Certaines pages ont commenté les balises "linkto" avec du texte entre les deux.basique si/alors avec PHP

Mon problème est que certaines de mes pages n'ont pas de texte "linkto". Quand je jette un lien vers cette page à partir de là, je veux tout saisir entre "title" et "/ title". Comment puis-je changer l'eregi de sorte que s'il se vide, il devrait alors saisir le titre?

Voici ce que j'ai jusqu'ici, je sais que j'ai juste besoin d'une sorte de si/alors mais je suis un débutant de rang. Merci d'avance pour toute aide:

<?php 

$filesource = $_SERVER['HTTP_REFERER']; 
$a = fopen($filesource,"r"); //fopen("html_file.html","r"); 
$string = fread($a,1024); 
?> 
<?php 
if (eregi("<linkto>(.*)</linkto>", 
$string, $out)) { 
$outdata = $out[1]; 
} 
//echo $outdata; 
$outdatapart = explode(" " , $outdata); 

echo $part[0]; 

>

+0

Ne supposez jamais que $ _SERVER ["HTTP_REFERER"] 'sera une variable non vide. C'est une variable non fiable car les navigateurs et les utilisateurs peuvent définir cette option pour ne rien contenir. – random

+0

... et ainsi peut proxies. – alex

Répondre

3

vous allez ici: si eregi() ne correspond pas, l'affectation OUTDATA $ ne se produira jamais comme si le bloc ne sera pas exécuté. Si cela correspond, mais qu'il n'y a rien entre les balises, $ outdata se verra attribuer une chaîne vide. Dans les deux cas,! $ Outdata sera vrai, donc nous pouvons revenir à un deuxième match sur la balise title à la place. J'ai aussi changé le

if(eregi("<linkto>(.*?)</linkto>", $string, $link_match)) { 
    $outdata = $link_match[1]; 
} 
if(!$outdata && eregi("<title>(.*?)</title>", $string, $title_match)) { 
    $outdata = $title_match[1]; 
} 

(. *) Dans le match pour (. *?). Cela signifie, ne soyez pas gourmand. Dans le (. *) Forme, si vous aviez $ string mis à

<title>Page Title</title> ... 
    ... <iframe><title>A second title tag!</title></iframe> 

Le regex correspond

Page Title</title> ... ... <iframe><title>A second title tag! 

Parce qu'il essaie de faire correspondre autant que possible, tant que le texte est entre tout et n'importe quel autre! (. *?) Sous la forme, le match fait ce que vous attendez - il correspond

Page Title 

Et arrête dès qu'il est capable.

...

En aparté, cette chose est un système intéressant, mais pourquoi avez-vous besoin? Les pages peuvent créer un lien vers d'autres pages et passer des paramètres via la chaîne de requête:

<a href="somescript.php?prevpage=Foo">...</a> 

Ensuite somescript.php peut accéder au paramètre prevpage via le $ _GET [ 'prevpage'] variables superglobale.

Cela résoudrait-il votre problème?

+0

Je ne veux pas changer tous les liens parce que je craignais que cela ne soit en conflit avec d'autres choses qui sont passées là-bas. Merci pour votre aide tout le monde. Je savais comment faire si/mais je ne savais pas comment dire "si aucun texte ne correspond à sa description". –

0

vous avez besoin d'if, else. Peut-être que vous auriez dû faire une recherche google rapide pour trouver cette réponse très simple.

+0

Wow, il a même dit "Je sais que c'est une sorte de déclaration si" ...... Je suis d'accord qu'un singe aurait pu googler cela mais vous n'avez pas besoin d'être sacrément sarcastique. – patricksweeney

+0

Ouais mais où vais-je trouver un singe?! Je savais comment faire "si" je ne savais pas comment dire "aucun texte ne correspond à cela". Merci pour votre aide cependant, je l'apprécie. –

0

Il suffit d'ajouter un autre test if avant d'attribuer le match à $outdata:

if (eregi("<linkto>(.*)</linkto>", $string, $out)) { 
    if ($out[1] != "") { 
     $outdata = $out[1]; 
    } else { 
     // Look in the title. 
    } 
} 
1

L'extension regex POSIX (ereg etc.) sera dépréciée à partir de PHP 5.3.0 et peut être complètement disparu venir PHP 6 , vous feriez mieux d'utiliser les fonctions PCRE (preg_match et amis). Les fonctions PCRE sont également plus rapides, binaires et prennent en charge plus de fonctionnalités telles que l'appariement non gourmand, etc.

Juste un pointeur.