Gå til innhold

hjelp til regex


Anbefalte innlegg

hei

 

i et skript jeg jobber med har jeg html-koden for en side i en streng.

jeg trenger å legge til en variabel foran adressene i alle linkene som IKKE starter med "http://"..

har prøvd med følgende regex, men det funker ikke..

det som skjer nå er at $dom kommer forran alle linker, ikke bare de som ikke begynner med http://

kan noen se hva som er gale?

 

$pattern = '^(a href=\"){1}(http://){0}^';
$replace = ('a href="' . $dom);
$side = preg_replace($pattern, $replace, $side);

 

har prøvd å sette utropstegn forran (http://) men det funker ikke..

da skjer det ikke noen forandringer..

 

takk for all hjelp

Lenke til kommentar
Videoannonse
Annonse

jeg far en feilmelding om jeg ikke gjor det..

noe om at endingperimiter eller delimiter ^ ikke blir funnet..

 

har provd a ta den vekk og finne andre losninger, men jeg fant ingen..

na kommer det ingen feilmeldinger, det bare funker ikke helt som det skal..

Endret av toss
Lenke til kommentar
sorry for dobbelpost..

men er det ingen som kan hjelpe?

5842707[/snapback]

 

Jubler.. min første regex ;) ( håper den virker nå da )

 



$pattern = '/((<a href=")(!http:\/\/))/i';
$replace = ('a href="' . $dom);
$side = preg_replace($pattern, $replace, $side);

 

Vi skal heler ikke nevne at jeg brukte nesten en halv time på det da ;)

 

EDIT: eni feil.. må fine en løsning på denne...

EDIT2: Fant feilen, nå skal jeg fine sengen...

Endret av trondes
Lenke til kommentar
  • 3 uker senere...

hei igjen

sorry for sent svar, men jeg dro på ferie rett etter forrige post, og kom igjen i dag..

 

den virket dessverre ikke..

legger ved hele koden i tilfelle noen vil ta seg tid til å se igjennom og kanskje finne en løsning..

koden er ikke renskrevet enda, men tror det skal gå ann å finne frem likevel.

 

<?php

session_start();

if(isset($_POST['key'])){
$_SESSION['key'] = $_POST['key'];
 }

if($_GET['signout']){
 unset ($_SESSION['key']);
}

$adr = $_POST['adr'];
$key = $_SESSION['key'];
$salt = "...";

if(!isset($adr)) {
 if(isset($_GET['adr'])){
   $adr = $_GET['adr'];
 } else {
 $adr = 'http://diskusjon.no';
 }
}

if(md5($salt . $key) === '4291af114e804723651b8e1b75d5b1e1'){
?>

<form action="noob2.php" method="post">

<fieldset>

<label for="adr">Adresse:</label>
<input type="text" name="adr" size="130" value="<?php echo($adr); ?>" />
<input type="hidden" name="signout" value="false">
<input type="submit" value="GO TO" />

</fieldset>
</form>

<form action="noob2.php?signout=true" method="post">
<input type="submit" value="Signout">
</form>

<hr><br>

<?php
$pattern = '^(http://[-a-zA-Z0-9\.]+)/';
ereg($pattern, $adr, $regs);
$dom = $regs[1];

$side = file_get_contents($adr);

$pattern = '/((<a href=")(!http:\/\/))/i';
$replace = ('<a href="' . $dom);
$side = preg_replace($pattern, $replace, $side);

echo $side;
?>

<?php

} else {

?>

<h2>Login</h2>
<form action="noob2.php" method="post">

<p>Entrancekey: <input type="password" name="key"><input type="submit" value="Log in"></p>

</form>

<?php
}
?>

 

takker for all hjelp :)

Lenke til kommentar

ok, da misforsto jeg deg

 

prøvd meg frem litt her:

function add_http_to_links($input) {
$p	=	'/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/';
$a	=	preg_split($p,trim($input),-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

foreach($a as $v) {
 if(strtolower(substr($v,0,2)) == "<a" && strpos($v,'href="http://') != true) {
 	$r[]	=	preg_replace('/href="(.*?)"/i','href="http://\\1"',$v);
 }
 else {
 	$r[]	=	$v;
 };
};

$input	=	implode("",$r);

return $input;
};

echo add_http_to_links($side);

 

funker hos meg, se hvis det funker til ditt bruk.

Lenke til kommentar
hei

 

i et skript jeg jobber med har jeg html-koden for en side i en streng.

jeg trenger å legge til en variabel foran adressene i alle linkene som IKKE starter med "http://"..

har prøvd med følgende regex, men det funker ikke..

det som skjer nå er at $dom kommer forran alle linker, ikke bare de som ikke begynner med http://

kan noen se hva som er gale?

 

$pattern = '^(a href=\"){1}(http://){0}^';
$replace = ('a href="' . $dom);
$side = preg_replace($pattern, $replace, $side);

 

har prøvd å sette utropstegn forran (http://) men det funker ikke..

da skjer det ikke noen forandringer..

 

takk for all hjelp

5820181[/snapback]

 

Du har lenker av type "vg.no" og skal sette http:// foran slike? Og hva er variabelen $dom?

 

Men hvis du har lenken "vg.no" og vil heller ha "http://vg.no" så kan du vel skrive noe slikt som dette:

<?php

$lenker = array("vg.no", "http://dagbladet.no","nibbler.no", "www.uib.no");
foreach($lenker as $lenke){
$pattern = "http:\/\/";
if(!preg_match("/^$pattern/", $lenke)){
 $lenke = preg_replace('/^/', 'http://', $lenke);
}
echo ("<a href=\"$lenke\">$lenke</a><br />");

}
?>
 

 

I variabelen $pattern skriver jeg hvordan jeg vil lenkene skal begynne. Siden / er en delimiter i regulære uttrykk må den escapes (derfor \/\/). Så sier jeg at hvis ikke strengen begynner med (vises ved ^) tekst slik det står i pattern - bytt ut begynnelsen av strengen (vises som ^ i preg_replace) med http://

Lenke til kommentar

tusen takk for svar.

 

variabelen $dom er adressen til siden som hentes frem uten siste biten, eller filnavnet..

 

det jeg vil er altså å legge $dom til forran alle linker som ikke starter med http://

beklager dårlig forklaring tidligere.

 

i en vanlig html side (feks. http://www.minside.no/home/mittliv.html) vil kanskje en link se slik ut: "/skoletur06.html", og de vil jeg gjøre om til http://www.minside.no/home/skoletur06.html.

 

dette vil gjøres automatisk i nettleseren, men skriptet er en tunnel, eller hva man vil kalle det så nettleseren vil sette http://mintunnel.no/ forran i stedet for $dom, og lenke til en side som da ikke finnes, eller i hvert fall være helt feil..

 

$dom er allerede hentet ut av adressen og vil da være http://www.minside.no/home/

 

håper dette var bedre forklart..

 

igjen tusen takk for all hjelp

Lenke til kommentar

function add_http_to_links($input) {
$p = '/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/';
$a = preg_split($p,trim($input),-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
global $dom;
foreach($a as $v) {
if(strtolower(substr($v,0,2)) == "<a" && strpos($v,'href="'.$dom) != true) {
 $r[] = preg_replace('/href="(.*?)"/i','href="'.$dom.'\\1"',$v);
}
else {
 $r[] = $v;
};
};

$input = implode("",$r);

return $input;
};

echo add_http_to_links($side);

 

tror dette burde være nok.

Lenke til kommentar

jeg skal finne alle linker pa en hel side og sjekke om de begynner med http://..

om de ikke gjoer det, skal jeg putte $dom inn forran linken..

det vil funke fintofr a sjekke om brukeren har skrevet http:// inn i feltet, men den vil ikke soeke hele siden for linker uten http://, og det er det jeg trenger..

 

jeg vil kanskje fa bruk for det du lagde, sa takk for det, men det var ikke loesningen pa det egentlige problemet..

Lenke til kommentar
jeg skal finne alle linker pa en hel side og sjekke om de begynner med http://..

om de ikke gjoer det, skal jeg putte $dom inn forran linken..

det vil funke fintofr a sjekke om brukeren har skrevet http:// inn i feltet, men den vil ikke soeke hele siden for linker uten http://, og det er det jeg trenger..

 

jeg vil kanskje fa bruk for det du lagde, sa takk for det, men det var ikke loesningen pa det egentlige problemet..

5939626[/snapback]

 

Slik du vil ha det da?

http://www.vestnes.org/tmp/test03.php

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...