webForumDet fria alternativet

Regex: vad använda i.st.f. Function eregi()

Webbutveckling

9 svar · 908 visningar · startad av Danne V

Medlem sedan aug. 20068 090 inlägg
Frågan#1

Antar att det är regex...

Har ett gammalt php-skript gjort för php4. Function eregi() is deprecated. Vad kan man ersätta funktionen med i php5?

PS: Det gäller en newsletter-applikation som heter Ccmail. Antar att det handlar om att filtrera mailen... så här ser sjoket ut som funktionen ingår i:

{
	$settings_dir = $dir; //directory to explore
	$files_array = array();
	$settings = array();
	if(is_dir($settings_dir)) {
	
	if ($handle = opendir($settings_dir)) 
	{
	while (false !== ($file = readdir($handle))) 
	{
		if(!$filenames_only && is_file($settings_dir . "/" . $file) && $file != "." && $file != ".." && ereg("\.ccmail$", $file))
			array_push($files_array, $file);
		else if($filenames_only && is_file($settings_dir . "/" . $file) && $file != "." && $file != "..")
			array_push($files_array, $file);
	}
	}
	if ($filenames_only) return $files_array; //optionally returns only the array with file names
	foreach ($files_array as $item) //creates an array with "filename" => "contents"
	{
		$file = @fopen($settings_dir . "/" . $item, "r");
		if (@flock($file, LOCK_SH)) //acquires lock
		{
			$temp = explode("\"", @fread($file, @filesize($settings_dir . "/" . $item)));
			$settings[str_replace(".ccmail", "", $item)] = trim($temp[1]);
			@flock($file, LOCK_UN); //releases lock
		}
		@fclose($file);
	}

	}
	return $settings;
}

Red: har det här med saken att göra: http://www.php.net/manual/en/function.preg-replace.php ?

Medlem sedan jan. 2005953 inlägg
#2

preg_replace() används för att ersätta en delsträng.
Titta på preg_match()

Medlem sedan aug. 20068 090 inlägg
#3

metalboy skrev:

preg_replace() används för att ersätta en delsträng.
Titta på preg_match()

...Hmmm ok... och hur/var gör jag vad i kodsnutten ovan för att det ska funka (asså, jag vet inte ett jota om det här...all hjälp mottages med stor tacksamhet) :r :r :r

Medlem sedan jan. 2005953 inlägg
#4

Byt ut

ereg("\.ccmail$", $file)

mot

preg_match('/\.ccmail$/', $file)

Notera att du med preg_match måste använda s.k. avgränsare (delimiters) i ditt mönster.
PHP tillåter att man använder i stort sett vilket tecken som helst som avgränsare, jag som programmerade Perl innan jag började med PHP tycker det känns naturligt att använda / i de flesta fall.

:)

Medlem sedan aug. 20068 090 inlägg
#5

metalboy skrev:

Byt ut

ereg("\.ccmail$", $file)

mot

preg_match('/\.ccmail$/', $file)

Notera att du med preg_match måste använda s.k. avgränsare (delimiters) i ditt mönster.
PHP tillåter att man använder i stort sett vilket tecken som helst som avgränsare, jag som programmerade Perl innan jag började med PHP tycker det känns naturligt att använda / i de flesta fall.

:)

Najs!

Nu försvann de första felmeddelandena och jag kunde i vart fall försöka skicka ett testmail. Men då kom ett nytt felmeddelande:

Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in /home/polaris/public_html/ccmail/functions/shared.php on line 45

Rad 45 i den filen är den som börjar "if (preg_match($regexp...." nedan

{
	$regexp = "^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$";
	if (preg_match($regexp, $email)) return true;
	else return false;
}

Hur fixar man det? :r :r :r skäms en gång till...

Medlem sedan jan. 2005953 inlägg
#6

Nu är det det där med avgränsare jag nämnde.
Du måste ha ett tecken som är likadant i början och slutet av strängen. T.ex. /. Det tecken du väljer måste specialkodas om det ska användas inne i strängen genom att sätta \ framför.

Exempel:

$regexp = "/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/";
Medlem sedan aug. 20068 090 inlägg
#7

metalboy skrev:

Nu är det det där med avgränsare jag nämnde.
Du måste ha ett tecken som är likadant i början och slutet av strängen. T.ex. /. Det tecken du väljer måste specialkodas om det ska användas inne i strängen genom att sätta \ framför.

Exempel:

$regexp = "/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/";

Ållrajt, det var där dom skulle vara alltså. Nu funkade det galant!
Tusen tack för hjälpen!

Medlem sedan aug. 20068 090 inlägg
#8

Äsch..det var ju inte slut med det.
Nu dök följande felmeddelande upp:

Warning: preg_replace() expects at least 3 parameters, 2 given in /home/polaris/public_html/ccmail/admin.php on line 585

Där hade jag lagt in vad jag antog var rätt:

	if (preg_replace("/^[0-9]+$/", $applied_settings['max_displayed_recipients']) && preg_replace("/^[0-9]+$/", $applied_settings['pause_for']) && preg_replace("/^[0-9]+$/", $applied_settings['pause_every']))
	{

Orkar du är det skitbussigt. Orkar du inte, så får jag försöka överleva....

PS: Det fungerar i alla fall, trots felmeddelandena. Så det är ju ingen katastrof...

Medlem sedan jan. 2005953 inlägg
#9

Jag tror du har skrivit fel funktionsnamn bara ;)
Ändra till preg_match() :)

Medlem sedan aug. 20068 090 inlägg
#10

metalboy skrev:

Jag tror du har skrivit fel funktionsnamn bara ;)
Ändra till preg_match() :)

Ooooops...
Nu gick det bättre.
Tack.

257 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)