Ağustos 12 2008
Asp.Net 3.5 İngilizce Kitap

Microsoftun yeni yazılım dili olan asp.net 3.5 dilindeki kitap.
Tür:ASP.NET 3.5
Dil:İngilizce
Sayfa sayısı:1400
Yazar:Andrew Troelsen
Dosya Boyutu:18 mb

Microsoftun yeni yazılım dili olan asp.net 3.5 dilindeki kitap.
Tür:ASP.NET 3.5
Dil:İngilizce
Sayfa sayısı:1400
Yazar:Andrew Troelsen
Dosya Boyutu:18 mb

PHP dili ile web programlama yapanlara büyük kolaylıklar sağlayan bir program. Pek çok dili (HTML, PHP, JavaScript vs.) destekleyen ayrıca zeki kod renklendirmesi sayesinde kodları birbirine karıştırmamanızı sağlayan kullanışlı bir yazılım.
PHP Designer 2008′i İndirin. (Trial Version)
Bu örneğimde HTML ile kullanabileceğiniz renklerin onaltılık tabandaki karşılıklarını veren bir PHP betiği var. Betik 512 tane rengin onaltılık kod karşılığını vermektedir. Aynı betik üzerinde sadece bir küçük değişiklik yaparak tam olarak 4096 tane rengin onaltılık karşılığını almak mümkündür. Bunu için, kodun başında yorum işareti ile verilen $d dizisini (16 elemanlı) yorum olmaktan çıkarıp normal (8 elemanlı) olan diziyi yorum satırı haline getirmek yeterlidir.
Fakat 4096 renk arasından kullanacağınız rengi seçmek gerçekten çok güçtür ve renk tonlamalarındaki geçişler çok yumuşak olduğu için çoğu renk birbirinin aynı gibi görünecektir.
<!– Bu dosyayı renk.php adı ile kaydedin –>
<html><head><title>HTML Renk Kodları</title></head>
<body bgcolor="#e8e8e8" text="#000000">
<center>
<h1>HTML Renk Kodları</h1>
<table border="0" width="540" cellpadding="0" cellspacing="2">
<?
//$d = array("0","1","2","3","4","5","6","7","8","9","a", "b","c","d","e","f");
$d = array("0","2","4","6","8","a","c","e");
$d_c = count($d);
// Kırmızı
$r_i = 0;
while($r_i <$d_c) {
$r = $d[$r_i] . $d[$r_i];
// Yeşil
$g_i = 0;
while($g_i <$d_c) {
$g = $d[$g_i] . $d[$g_i];
// Mavi
$b_i = 0;
echo "<tr>";
while($b_i <$d_c) {
$b = $d[$b_i] . $d[$b_i];
// HTML Kodu ile tablonun satirlari olusturuluyor
$renk = "#" . $r . $g . $b;
echo "\n<td style=’background:$renk; color:white’><b>$renk</b>";
$b_i++;
}
echo "\n";
$g_i++;
}
$r_i++;
}
?>
</table></center></body></html>
Belirtilen ölçütleri temel alan belirtilen tablodaki alanların değerlerini değiştiren bir güncelleştirme sorgusu oluşturur.
UPDATE özellikle, çok sayıda kaydı değiştirmek istediğinizde veya değiştirmek istediğiniz kayıtlar çok sayıda tablo içinde iken kullanışlıdır.
Aynı anda çok sayıda alanı değiştirebilirsiniz. Aşağıdaki örnek Sipariş Miktarı değerlerini yüzde 10 arttırır ve Navlun değerlerini İngiltere’deki taşımacılar için yüzde 3 arttırır:
UPDATE Siparisler
SET Siparismiktari = Siparismiktari * 1.1,
Navlun = Navlun * 1.03
WHERE ulke= ‘almanya’;
UPDATE, bir sonuç kümesi oluşturmaz. Ayrıca, güncelleştirme sorgusunu kullanarak kayıtları güncelleştirdikten sonra, işlemi geri alamazsınız.
Hangi kayıtların güncelleştirildiğini bilmek istiyorsanız, sonuçları önce aynı ölçütü kullanan bir seçme sorgusu ile denetleyin ve sonra güncelleştirme sorgusunu çalıştırın.
Her zaman verilerinizin yedeklerini saklayın. Yanlış kayıtları güncelleştirirseniz, kayıtları yedek kopyalardan alabilirsiniz.
CONSTRAINT Yan Tümcesi
Bir kısıtlama bir dizine benzer, ancak bir başka tablo ile ilişki kurmak için de kullanılabilir.
CONSTRAINT yan tümcesini ALTER TABLE ve CREATE TABLE deyimlerinde, kısıtlama oluşturmak veya silmek üzere kullanabilirsiniz.
İki tür CONSTRAINT yan tümcesi vardır: tek bir alanda bir kısıtlama oluşturmak için bir tane ve birden çok alanda bir kısıtlama oluşturmak için bir tane.
Sözdizimi
Tek alan kısıtlaması:
CONSTRAINT adı {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES yabancıtablo [(yabancıalan1, yabancıalan2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
CONSTRAINT adı
{PRIMARY KEY (birincil1[, birincil2 [, ...]]) |
UNIQUE (benzersiz1[, benzersiz2 [, ...]]) |
NOT NULL (nulldeğil1[, nulldeğil2 [, ...]]) |
FOREIGN KEY [NO INDEX] (başvuru1[, başvuru2 [, ...]]) REFERENCES yabancıtablo [(yabancıalan1 [, yabancıalan2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Tek alan kısıtlaması sözdizimini, ALTER TABLE veya CREATE TABLE deyiminin alan tanımı yan tümcesinde alanın veri türünün belirtiminin hemen ardından kullanabilirsiniz.
Çok alan kısıtlaması sözdizimini, ALTER TABLE veya CREATE TABLE deyiminde alan tanımı yan tümcesinin dışında CONSTRAINT saklı sözcüğünü her kullandığınızda kullanırsınız.
CONSTRAINT yan tümcesini kullanarak, bir alanı aşağıdaki kısıtlama türlerinden biri olarak belirleyebilirsiniz:
UNIQUE saklı sözcüğünü, bir alanı benzersiz anahtar olarak belirlemek üzere kullanabilirsiniz.
Bu, tablodaki iki farklı kaydın bu alanda aynı değere sahip olamaması anlamına gelir. Herhangi bir alanı veya alan gurubunu, benzersiz olarak kısıtlayabilirsiniz.
Çok alanlı bir kısıtlama bir benzersiz anahtar olarak belirlendiyse, dizindeki tüm alanların birleştirilmiş değerlerinin benzersiz olması gerekir; bu alanlardan yalnızca
birindeki değer bir veya daha çok kayıtta aynı olabilir.
PRIMARY KEY saklı sözcüklerini, bir alanı veya bir alan kümesini bir tabloda birincil anahtar olarak belirlemek üzere kullanabilirsiniz. Birincil anahtardaki tüm değerlerin benzersiz olması ve Null olmaması gerekir; ayrıca, bir tabloda yalnızca bir tek birincil anahtar olabilir.
ALTER TABLE Deyimi
CREATE TABLE deyimi ile oluşturulan tablonun tasarımını değiştirir.
ALTER TABLE deyimini kullanarak var olan bir tabloyu farklı yollarla değiştirebilirsiniz. Şunları yapabilirsiniz
Tabloya yeni bir alan eklemek için ADD COLUMN’ı kullanabilirsiniz. Alan adını, veri türünü ve isteğe bağlı olarak boyutu (Metin ve İkili alanlar için) belirtirsiniz.
Örneğin, aşağıdaki deyim Çalışan tablosuna Notlar adlı 25 karakterlik bir Metin alanı ekler.
ALTER TABLE Çalışan ADD COLUMN Notlar TEXT(25);
Bir alan için NOT NULL özelliğini belirlerseniz, bu alanda geçerli veriler bulundurmak üzere yeni kayıtlar gerekir.
Var olan bir alanın veri türünü değiştirmek için ALTER COLUMN’ı kullanabilirsiniz. Alan adını, yeni veri türünü ve isteğe bağlı olarak Metin ve İkili alan boyutunu belirtirsiniz.
Örneğin aşağıdaki deyim, Çalışan tablosundaki özgün olarak Tamsayı şeklinde tanımlı PostaKodu alanının veri türünü 10 karakterlik Metin alanı olarak değiştirir:
ALTER TABLE Çalışan ALTER COLUMN PostaKodu TEXT(25);
UYARILAR:
Bir anda birden çok alan veya dizin ekleyemez veya silemezsiniz.
Bir tabloya tek veya çok alanlı dizin eklemek için CREATE INDEX deyimini kullanabilirsiniz;
ya da ALTER TABLE veya CREATE INDEX ile oluşturulmuş bir dizini silmek için DROP deyimini kullanabilirsiniz.
Tek bir alanda veya CONSTRAINT adlı tek veya çok alana uygulanmış adlandırılmış bir CONSTRAINT yan tümcesinde NOT NULL kullanamazsınız.
Bununla beraber, NOT NULL kısıtlamasını yalnızca bir kez bir alana uygulayabilirsiniz. Bu kısıtlamayı birden çok kere uygulamayı denerseniz,
çalışma anı hatası alırsınız.
ORDER BY Yan Tümcesi
Sorgunun sonuç kayıtlarını belirtilen alan veya alanlara göre artan veya azalan sırada sıralar.
ORDER BY isteğe bağlıdır. Ancak, kayıtların sıralanmış olarak görüntülenmesini istiyorsanız ORDER BY’ı kullanmalısınız.
Varsayılan sıralama düzeni artan düzendir (A’dan Z’ye, 0′dan 9′a). Aşağıdaki örneklerden her ikisi de, çalışan adlarını soyadına göre sıralar:
SELECT Soyadi, Adi
FROM Calisanlar
ORDER BY Soyadi;
SELECT Soyadi, Adi
FROM Calisanlar
ORDER BY Soyadi ASC;
Azalan sırada sıralamak için (Z’den A’ya, 9′dan 0′a), azalan sırada sıralamak istediğiniz her alanın sonuna DESC saklı sözcüğünü ekleyin.
Aşağıdaki örnek maaşları seçer ve bunları azalan sırada sıralar:
SELECT Soyadi, Maas
FROM Calisanlar
ORDER BY Maas DESC, Soyadi;
ORDER BY genellikle bir SQL deyiminin son sözcüğüdür.
ORDER BY yan tümcesinde ek alanlar da bulundurabilirsiniz. Kayıtlar, ORDER BY’dan sonra listelenen ilk alana göre sıralanır.
Bu alanda aynı değere sahip olan kayıtlar, listelenen ikinci alana göre sıralanır ve bu böylece devam eder.
Adres satırından get metoduyla bilgiyi alıp bunu hit alanında update yaptırmaktır.işte bunun için veritabanınızda tablo yapınız şu şekilde olsun id,konu,makale,hital bu 3 alanı şimdilik gösterecem,daha sonra siz mantığını kavramış bir şekilde geliştirme yaparsınız.millet makaleye tıklayınca hit 1 artsın şekilde ayarlamamız gerekecektir.yani işin türkçesi şu,her kim adres satırında ki makaleye ait bilgiyi tıklarsa,o alana ait hit artış göstersin.Şimdi ilk önce şöyle başlıyalım.Makalemizin konusuna link verdirelim ve bu linke tıklandıgında makalenin kendisine gitsin.ve hemen altında da bu makale x kez okundu diye bilgi verdirelim.
/*mysql ayarlarınızı yazın */
/*sorgu komutlarını gönderiyoruz */
$tablo="select * from hital";
$sorgu=mysql_query($tablo);
while ($oku=mysql_fetch_assoc($sorgu) ) {
echo ‘<a href="makale.php?id=’.$oku[id].’">’.$oku[konu].’</a>’;
}
Gördüğünüz gibi baskıladıgımız linkte makale.php?id=x gibi bir link verdirdik.yani burada x o makalenin kendi özel numarasıdır.ve konu ismini de linklendirmiş olduk.Şimdi ise makale.php dosyamızı hazırlayalım.
* mysql ayarlarınızı yazın */
/*adres satırında get ile ide ait değişkeni alıyoruz */
$id=(mysql_real_escape_string(abs(intval($_GET['id']))));
/* sorgu gönderiyoruz */
$tablo="select*from hital where id=’$id’";
$hit_artis=mysql_query("UPDATE hital SET hit=hit+1 WHERE id=’$id’ ");
$sorgu=mysql_query($tablo);
while ($oku=mysql_fetch_assoc($sorgu) ) {
echo ‘bu makale ‘.$oku[hit].’ kez okundu <br /><br />’.$oku[makale].”;
}
Burda ise yaptıgımız iş $_GET komutuyla makale.php?id=x e ait x numarasını elde etmek.Bu sayede her linke tıklandıgında ona özel numarayı açarak,ilgili makaleyi görüntülemektir maksadımız.daha sonra ise $hit_artis komutuna hit=hit+1 gibi update komutu yazdırdık.burada veritabanınızda ki varsayılan değer 0 dır.buna gore her link tıklanısında hit alanı update yapacaktır.
Problem : Uzaktaki makineye soket acarak baglanmak istiyorsunuz.
Cozum: TCP ile uzaktaki bir makineye baglanmak icin fsockopen () hazir fonksiyonu kullanilir.
Not: Baska bir sunucuya izin almadan soket acarak baglanmak istemedigim icin php.org.tr’in egitim sunucusunu kullaniyorum.(turk-php.com virtual host uzerinde oldugu icin istedigim sonucu alamiyorum…)
<?php
$baglanti = fsockopen(”www.php.org.tr”, 80, $errno, $errstr, 30);
if (!$baglanti) {
die($errstr);
}
fputs($baglanti, “GET / /HTTP/1.0 \r\n\r\n”);
while (!feof($baglanti)) {
$satir = fgets($baglanti, 2048);
echo $satir;
}
fclose ($baglanti);
?>
Bir diger cozum ise PHP’nin soket kutuphanesini kullanmaktir.(PHP icerisinden bu modulu kullanabilmek icin configure betigi –enable-sockets parametresi ile calistirilmalidir.)
<?php
$url = ‘www.php.org.tr’;
$serv_port = getservbyname(’www’, ‘tcp’);
$adres = gethostbyname($url);
$sock = socket (AF_INET, SOCK_STREAM, 0);
if ($sock < 0) {
die(strerror($sock));
}
$res = connect($sock, $adres, $serv_port);
if ($res < 0) {
die(strerror($res));
}
$veri = “HEAD / HTTP/1.0 \r\n\r\n”;
write ($sock, $veri, strlen($veri));
while (read($sock, $cevap, 2048)) {
print $cevap;
}
close ($sock);
?>
Her iki programda ayni islevi gormektedir.Ilk programda fsockopen () hazir fonksiyonu yardimiyla sokete baglanmak icin bir arayuz olustrulmustur.
Ikinci programda, programciya daha fazla kontrol sunan soket modulu kullanilmistir.Bu kutuphane ile daha dusuk seviyeli C API’lerine direkt erisim saglanmaktadir.
CSS (Cascading Style Sheets)’e geçiş, çok da pratik olmayan bir süreçtir. Çoğu zaman yeni başlayan meraklı, CSS’in yarattığı sorunlarla boğuşmaktan sıkılarak eski metodlara geri döner. Bunun sebebi aslında CSS’in kendisi değil, keyfi bir şekilde CSS yorumlayan browser programlarıdır. Nitekim, float ile tanımalanan bir içerik bloğu, Explorer’da, Opera’da, Firefox’da ve diğer platformlarda farklılıklar gösterir. Kısmen çeviri, kısmen alıntı ve derleme olan bu yazıdaki clearfix metodu bu duruma yardımcı olabilecek bir css pratiğidir.
Bordürlü ya da zemin desenli bir blok içerisinde float özelliğine sahip bir blok tanımlarken hepiniz fark etmişsinizdir. Konteyner, içerisindeki float özelliğine sahip blokun boyutunu kaale almaz ve içeriğindeki görsel elemanlar bitince bloku kapatır. Bunun sonucunda float ile tanımlanmış blok, diğerine yapıştırılmış bir post-it gibi aşağıdan sarkar. Bu, Explorer’da bazen geçerli olmayabiliyor; konteynere boyutlama ile ilgili değerler vermişseniz W3C standardına rağmen Explorer bunu yanlış yorumlayarak istediğimiz şekilde göstermekte. Opera 7 ise IE yolundan gitmeye hevesli olduğundan aynı yorumlamayı o da yapmakta.
Oysa W3C standardında float ve clear tanımlamalarının kullanımı için konteynerdeki son öğeden sonra clear kullanımıyla konteyner float verilmiş iç blokları da kapsaması sağlanması önerilir. Buna uygun olarak çoğu tasarımcının kullandığı metod şuna benzer bir yaklaşım oluyor:
<div class="floatnotclear">
<div class="float">Serbest iç blok</div>
<div style="clear: both">Alanın içeriği olan yazı.</div>
Bu içerik, clear kullanılmadığında yukarıya yapışır.
</div>
Bu yöntem pratik ve kolay uygulanabilir olsa da daha karışık sayfalarda bir sürü fazladan clear blokları tanımlamasına yol açmakta ve kodumuzu ideal halden uzaklaştırmakta. Sonuçta CSS ve XHTML kullanmamızın önemli sebeplerinden biri, gereksiz kod kullanımına son vererek sadece en gerekli tanımlayıcı kodları kullanmak istememiz.
Matt Brubeck sitesinde bu konuyla ilgili CSS2 odaklı bir düzenlemeyle bu problemi aşmakta. :after ikincil tanımlamasıyla HTML kodda gözükmeyen bir içeriği, konteynere ekleyerek her float blokun konteyner bloku tarafından kapsanmasını sağlıyor.
.item {
border: 1px solid black;
padding: 0.5em;
}
img {
float: left;
}
.item:after {
content: "";
display: block;
height: 0;
clear: both;
}
<div class="item">
<img src="monkey.png" />
<p>Yandaki resim ile bu içeriğin ilişkisi çok belirleyicidir.</p>
</div>
:after ikincil tanımlaması, Mozilla 1.x, NS6 ve NS7 ve Opera 7′de düzgün çalışmakta. Windows ve Macintosh üzerinde IE5 ve IE6 tarafından desteklenmemekte. CSSCreator sitesinin yaklaşımına göre bunu biraz daha ilerletirsek:
.floatcontainer:after{
content: ".";
display: block;
height: 0;
font-size:0;
clear: both;
visibility:hidden;
}
Eklenen şey, tamamen bir noktadır. Yüksekliği ve font boyutunu sıfırlayarak, görünürlüğü de kaldırarak eklenen bu noktanın bütün bir boş satır gibi gözükmesini engellemiş oluruz. display:block’un kullanılma sebebi, konteyner’ın inline olmasından ötürü bu blokun da inline değeri almasını engellemek ve clear özelliğini kullanmak istememiz. Bunun tek sebebi yine farklı browser’larda yorum hatasından kaçınmak; çünkü içeriği olmayan bir blok ögesi bir takım browser’larda sorun çıkarabiliyor. IE Mac için bazı problemlerle karşılaşacağız; bunları da temizlemek için ufak bir css-hack uyguluyoruz. :after tanımlamasını dikkate almayan IE/Win kendi yorumu olan auto-clear’i kullanacaktır. Ama bu, ancak bir boyutlama verilmişse gerçekleşebilir. Genellikle ölçü belirtmek çok da tercih edilmeyen bir durum olduğundan sadece IE/Win %1′lik bir yükseklik görecektir. Ama IE’nin diğer bir uyumsuzluğu bu hack’i geçerli hale getiriyor ve tüm bloklar genişletilerek içlerindeki blokları kapsaması sağlanıyor. IE Mac’in bu kısmı görmemesi de comment kısmının bir escape -yani backslash işareti- ile kapatılmasından comment satırının aslında devam ettiğini düşünmesi sayesinde oluyor. Sondaki comment kısmı da zaten bunun için bulunmakta. Peki sadece IE nasıl bu tanımlamayı görüyor da diğer browser’lar onu dikkate almıyor? IE html blokunun dışında onu kapsayan sanal bir blok varmış gibi hareket etmekte. Bizim uyguladığımız hack de o sanal bloku adreslemek; bu sayede sadece IE bunu fark ederek işleme sokuyor. display:inline-block, IE/Mac’de karşılaşacağımız diğer bir sorunu, blokun display tanımlamasını düzeltmesini sağlıyor. Alex Robinson bu konuyla ilgilenerek inline-block’un daha önceleri kullanılan inline-table hack’inden daha öncelikli olduğunu tespit etmiş.
<div class="clearfix">
<div class="float"> </div>
</div>
<p>Bu içerik, artık yukarıya yapışmadan gerekli mesafeyi bırakarak olması gerektiği gibi gözükür.</p>
clearfix:after{
content: ".";
display: block;
height: 0;
font-size:0;
clear: both;
visibility:hidden;
}
.clearfix {
display: inline-block;
}
/* IE Mac için hack \*/
* html .clearfix {
height: 1%;
}
.clearfix {
display:block;
}
/* hack bitişi */
Bu haliyle artık ikincil bir clear tanımlamasına gerek kalmadan konteynerın float blokunu gerçekten kapsamasını ve minimum boyunu buna göre ayarlamasını sağlamış oluyoruz. Bu tekniklerin bir araya getirilmesiyle gerçek anlamda bir clearfix metodumuz var; Doug, Mark Hadley, Matt Keogh, Holly’n John ve Tony Asslet‘in yardımlarıyla.
Drupal, şimdiye kadar bir framework ciddiyetine sahip gördüğüm en başarılı OpenSource yazılım. Bir süre önce (2005′in başlarında sanırım) Drupal’le diğer bir projem olan elastik yüzünden bayağı bir haşır-neşirdim. İmaj dosyalarının da önemli olduğu bu projede pratik bir şekilde bir flash-galeri yapısı kurmak istiyordum ve Plasmado‘da yapı itibarıyla bana çok kullanışlı gelmişti. Amacım tamamen Drupal’e yönelik yeni bir modül yaratmak değil, bir gecede kolay entegre edip yayınlayabileceğim bir bağlantı kurmaktı.
Framework dememin başlıca sebebi, ekibin Drupal’in öncelikle omurgası üzerine odaklandıkları ve API’sini de kolay kullanıma sundukları için. Aynı omurgayı alıp kendi CMS sisteminizi de yapabilmeniz mümkün; birçok kodu zaten önceden hazır zaten. Hoş, Drupal için geliştirilen envai çeşit modül ile buna gerek kalmadan istediğiniz fonksiyonları açıp kapatabiliyor ve kendi yazdığınız modüllerde var olan diğer modüllerin veya omurganın fonksiyonlarını kullanabiliyorsunuz.
Plasmado’yu, galerileri barındırdığım gallery directory’sine yerleştirdim. Galerilere ait resimler de bu directory’in altındaki folder’larda. Ekte verdiğim scripti ise crontab üzerinden belirli aralıklarla çalıştırmaktayım. Drupal’de galerilerde eklenenleri istediğiniz aralıklarla aynı database’de yer alan Plasmado tablosuna eklemekte.
Plasmado’nun tablosunu eklemek için orjinal sql scripti yerine bunu kullanın, scriptte biraz değişiklik yaptım zira.
CREATE TABLE `plasmado` (
`id` bigint(20) NOT NULL auto_increment,
`parent_id` bigint(20) default ‘0′,
`title` varchar(255) default NULL,
`src` varchar(255) default NULL,
`width` int(15) default ‘0′,
`height` int(15) default ‘0′,
`comments` varchar(255) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT;
Aşağıda sıklıkla kullanmaya başladığım CodeIgniter için helpers/url_helper içerisinde yer alan url_title fonksiyonunun Türkçe karakterleri düzgün replace eden hali bulunuyor. Fonksiyon çok global bir library mantığında olduğu için, bir string içeriğin URL’e uygun hale getirmek isterseniz de kullanabilirsiniz.
function url_title($str, $separator = ‘dash’)
{
if ($separator == ‘dash’)
{
$search = ‘_’;
$replace = ‘-’;
}
else
{
$search = ‘-’;
$replace = ‘_’;
}
$trans_tr = array(
"ç"=> ‘c’,
"Ç"=> ‘c’,
"ş"=> ’s’,
"Ş"=> ’s’,
"ı"=> ‘i’,
"İ"=> ‘i’,
"ğ"=> ‘g’,
"Ğ"=> ‘g’,
"ü"=> ‘u’,
"Ü"=> ‘u’,
"ö"=> ‘o’,
"Ö"=> ‘o’,
"\("=> ‘_’,
"\)"=> ‘_’
);
foreach ($trans_tr as $key => $val)
{
$str = preg_replace("/".$key."/", $val, $str);
}
$trans = array(
$search => $replace,
"\s+" => $replace,
"[^a-z0-9".$replace."]" => ”,
$replace."+" => $replace,
$replace."$" => ”,
"^".$replace => ”
);
$str = strtolower($str);
$str = strip_tags($str);
foreach ($trans as $key => $val)
{
$str = preg_replace("/".$key."/", $val, $str);
}
return trim(stripslashes($str));
}