Ik heb altijd al problemen met Regex gehad, maar nu zou ik een regex willen die enkel A-Za-z0-9, spaties en _ mag hebben. Nu dacht ik te werken met [A-Za-z0-9], maar hoe pas ik die spatie en die _ erin? En moet ik dan nog dingen als ^, +, * of dergelijke dingen toevoegen? Met welke functie moet ik het gebruiken? Kan iemand me helpen met deze regex?
Zo zal ie dus werken als ik enkel letter, cijfers (hoofdletterongevoelig), spaties en underscrores (of hoe je dat ook typt, ik bedoel _) wil? Of ben ik verkeerd?
Je moet goed op de errors letten. No ending delimiter betekend dat je een begin en eind "delimiter" bent vergeten.
Dat is een character die aan het begin en an het eind staat (random heeft hiervoor # gebruikt). Dit zorgt ervoor dat je extra argumenten (modifiers) kan geven bijvoorbeeld:
/.../i (/ = de delimiter, ... is de pattern van je regexp en i is het argument (modifier). )
Verder moet je dit alleen gebruiken bij preg_ functions en niet bij ereg functies. preg_ is een stuk beter, en dan moet je dus met delimiters werken.
<?php
function parse_img($tekst,$img_w)
{
if(preg_match('#\[img\](http://)(.*?)\[/img\]#i',$tekst,$matches))
{
$url = $matches[1].$matches[2];
//Alle gegevens weergeven
if(list($width,$height,$type,$attr) = @getimagesize($url))
{
//Als de hoogte van het origineel groter is dan het toegestane
if($width > $img_w)
{
$deel = $width/$img_w; //Breedte delen door maximum
$kl_wi = $width/$deel; //Maximale breedte delen door de factor $deel
$kl_he = $height/$deel; //Maximale hoogte delen door de factor $deel
$ok_wi = floor($kl_wi); //Maximale breedte afronden naar onder, dit is de breedte die we geven aan het verkleinde
$ok_he = floor($kl_he); //Maximale hoogte afronden naar onder, dit is de hoogte die we geven aan het verkleinde
}
//Anders is de breedte niet overschreden
else
{
$ok_wi = $width; //De breedte is het origineel (er moest immers niks veranderen)
$ok_he = $height; //De hoogte is het origineel (er moest immers niks veranderen)
}
//Vervang
$tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','<a href="'.$url.'" target="_blank"><img src="'.$url.'" width="'.$ok_wi.'" height="'.$ok_he.'" border="0" alt="Image" /></a>', $tekst);
}
else
$tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','[Image bestaat niet]', $tekst); //Anders gewoon laten
}
return $tekst;
}
?>
<?php
function parse_img($tekst,$img_w)
{
if(preg_match_all('#\[img\](http://)(.*?)\[/img\]#i',$tekst,$matches))
{
foreach($matches[1] as $key => $http)
{
$url = $matches[1][$key] . $matches[2][$key];
//Alle gegevens weergeven
if(list($width,$height,$type,$attr) = @getimagesize($url))
{
//Als de hoogte van het origineel groter is dan het toegestane
if($width > $img_w)
{
$deel = $width/$img_w; //Breedte delen door maximum
$kl_wi = $width/$deel; //Maximale breedte delen door de factor $deel
$kl_he = $height/$deel; //Maximale hoogte delen door de factor $deel
$ok_wi = floor($kl_wi); //Maximale breedte afronden naar onder, dit is de breedte die we geven aan het verkleinde
$ok_he = floor($kl_he); //Maximale hoogte afronden naar onder, dit is de hoogte die we geven aan het verkleinde
}
//Anders is de breedte niet overschreden
else
{
$ok_wi = $width; //De breedte is het origineel (er moest immers niks veranderen)
$ok_he = $height; //De hoogte is het origineel (er moest immers niks veranderen)
}
//Vervang
$tekst = str_replace('[img]'.$url.'[/img]','<a href="'. $url .'" target="_blank"><img src="'. $url .'" width="'.$ok_wi.'" height="'.$ok_he.'" border="0" alt="Image" /></a>', $tekst);
}
else
{
$tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','[Image bestaat niet]', $tekst); //Anders gewoon laten
}
}
}
return $tekst;
}
?>
getimagesize(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
getimagesize(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
Waarom onderdrukt ie @ dat niet? En hoe los ik het op?
getimagesize(http://www.harrypotter-dreuzels.com/images/lay-out/header.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
Waarom werkt de @ niet? Kan er geen andere manier, bv. het url checken of het klopt (die @ is zo smerig)? Hoe?
Edit: Niemand?
Simon - 04/01/2007 10:05 (laatste wijziging 04/01/2007 10:16)
PHP expert
net voor de die list() doet een if'je met file_exists() ?
edit @ hieronder: ohja, dacht dat het om upgeloade afbeeldingen ging
file_exists is toch enkel voor op je eigen server (dit denk ik toch al ik de PHP.net pagina van file_exists lees)? Deze images kunnen ook van imageshack zijn of dergelijke.
Simon - 04/01/2007 10:19 (laatste wijziging 04/01/2007 10:20)
PHP expert
file_get_contents, ob_get_contents kunnen wel van andere bestanden lezen, maar die zullen waarschijnlijk ook errors geven
fopen(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
fopen(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
Die manier gebruik ik niet, ik zet hem op error_reporting(E_ALL) om zo alle errors te krijgen. set_error_handler() mailt die dan naar mij door, daarom dat ik dat liever niet doe.
M'n host draait geen PHP 5 (PHP 4.4.4), dus die stream functies zijn niet echt een optie. Ik weet dat ze er al zijn van PHP 4.3.0, maar in die tutorial staat alles al met PHP 5 functies uitgelegd. Is er toch een optie om met streams in PHP 4.4.4 te werken die doen wat ik wil?