Konuyu görüntüle
IUCODERS FORUM > Programlama > .NET > Editing data in Regex class for creating html controls
Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
06.04.2008-02:02 #41270
Tam ingilizcesini belki yazmadım ama tam manası ile problemin şu
[code]private MatchCollection GetTagContent(ref TextBox source, string tag)
{
//Taglar arasında ki text i almaya yarıyor.
string pattern = "'" + tag + "'(.*?)'/" + tag + "'";
Regex regex = new Regex(pattern, RegexOptions.Compiled);
MatchCollection mc = regex.Matches(source.Text);
return mc;
}

public void ConvertYoutubeVideo(ref TextBox source)
{
MatchCollection mc = GetTagContent(ref source, "EM");
Regex regular = new Regex("'EM'(.*?)'/EM'", RegexOptions.Compiled);
if (mc.Count >= 1)//Eğer tag varsa bunu bilinen bir html tagına ceviriyor.
{
string url = mc[0].Groups[1].Captures[0].Value;
string place = "<EMBED SRC=" + url + " HEIGHT=330 WIDTH=330 ></EMBED>";
source.Text = regular.Replace(source.Text, place);
}
else
source.Text = regular.Replace(source.Text, "");

}
public void ConvertQuote(ref TextBox source)
{

MatchCollection mc = GetTagContent(ref source, "QU");
Regex regular2 = new Regex("
");
source.Text = regular2.Replace(source.Text, "");
Regex regular = new Regex("'QU'(.*?)'/QU'", RegexOptions.Compiled);
if (mc.Count >= 1)//Eğer tag varsa oraya bir text area koyuyor.
{
string text = mc[0].Groups[1].Captures[0].Value;
string place = "<textarea id=TextAreaQuote cols=50 rows=10 readonly=readOnly style=background-color: gray>"+text+"





331. KSD
*.NET DEVELOPER




Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
06.04.2008-23:05 #41326
Mesajından bir şey anlaşılmıyor. Düzenlemeye çalışırken html kodları yüzünden form mu patladı yoksa? raised eyebrow





Let`s make this world a better place to live !

Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
06.04.2008-23:29 #41327
offman yazdi
 
Tam ingilizcesini belki yazmadım ama tam manası ile problemin şu
[code]private MatchCollection GetTagContent(ref TextBox source, string tag)
{
//Taglar arasında ki text i almaya yarıyor.
string pattern = "'" + tag + "'(.*?)'/" + tag + "'";
Regex regex = new Regex(pattern, RegexOptions.Compiled);
MatchCollection mc = regex.Matches(source.Text);
return mc;
}

public void ConvertYoutubeVideo(ref TextBox source)
{
MatchCollection mc = GetTagContent(ref source, "EM");
Regex regular = new Regex("'EM'(.*?)'/EM'", RegexOptions.Compiled);
if (mc.Count >= 1)//Eğer tag varsa bunu bilinen bir html tagına ceviriyor.
{
string url = mc[0].Groups[1].Captures[0].Value;
string place = "<EMBED SRC=" + url + " HEIGHT=330 WIDTH=330 ></EMBED>";
source.Text = regular.Replace(source.Text, place);
}
else
source.Text = regular.Replace(source.Text, "");

}
public void ConvertQuote(ref TextBox source)
{

MatchCollection mc = GetTagContent(ref source, "QU");
Regex regular2 = new Regex("
");
source.Text = regular2.Replace(source.Text, "");
Regex regular = new Regex("'QU'(.*?)'/QU'", RegexOptions.Compiled);
if (mc.Count >= 1)//Eğer tag varsa oraya bir text area koyuyor.
{
string text = mc[0].Groups[1].Captures[0].Value;
string place = "<textarea id=TextAreaQuote cols=50 rows=10 readonly=readOnly style=background-color: gray>"+text+"



Abi bu mesaj boyle değildi burada edit ederken patlamış olayı anlatmışdım buradan Orhana duyurulur code butonu ile bir sey yazılınca edit de sorun çıkıyor demekki neyse olaya gelelimben tam iucoders daki gibi butonlar varya mesaj gonderirken onun tarzı bir html editoru yapmak istiyorum burada yasadığım sorun ise şu ben bir kontrolu sayfaya koymadan (html kontrolleri için geçerli bu) veri tabanından cekerek (<input type="text" .... />) sayfaya basıyorum render oluyor içerisine bir seyler koyabiliyorum genel amaç bu bu manada sayfama youtube linkleri koydurabiliyorum kullanıcıya mesela 'EM'htttp://youtube.com?vide=13242'EM' ben bu veriyi alıp html deki <EMBED> tagına ceviriyorum ve src attributune linki veriyorum ve sayfam da render oluyor sorun şurada baslıyor adam
'EM'htttp://youtube.com?vide=13242
'EM'
şeklinde linki yazarsa yani link çok uzunda olabilir yani bir sekilde satır atlatırsa enter'a basıp bu benim olayımı iptal ediyor o zaman sayfa render olduğunda ben istediğim html kontrolunun sayfada goremiyorum yada orada sadece bir obje gorunuyor ....Sorun Regex classı var regular expression asp.net de onu kullanarak bu seyleri yakalamaya calışıyorum yukarda iki tag arasında seyleri yakalayan bir kodum var ve bu tagları youtube için eğer taf 'EM' ise <EMBED> tagına ceviren kodlar var isminden de anlasılacağı üzre birde alıntı için 'QU' tagı var her ikisinde de ortak sorun sahıs enter tusuna basıp aşağı inerse ben onu yakalayamıyorum ve bu yuzden tagı render eedemiyorum.





331. KSD
*.NET DEVELOPER




Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
07.04.2008-00:05 #41341
Kullandığın sistem POSIX destekliyor mu? Destekliyorsa [[:print:][:space:]]+ gibi bir ifadeyle aradaki metni çekmeyi dene.





Let`s make this world a better place to live !

Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
07.04.2008-01:23 #41354
Vallahi şafak inan ben o olayı bilmiorum PosIx kutuphanesi diye bir sey duymusdum heryerde calışıyormus felan ama yani bilmiyorum ya sen olsan boyle bir olayı tasarlamak iciin ne yapardın databasede bir htm controlunun tanımı var diyelim yani bir kayıt gibi dusun(<input type=text.../>)
sonra sen bunu sayfaya basabilmeni yani bu kaydını render edebilecek bir kontrolun daha var yapman gereken tek sey kullanıcıyı html kontrolleri ile uğraşdırdığını gostermeden ona basit taglar sunuyorsun
misalen youtube butonuna tıklayınca textbox a 'EM'http://''EM' ifadesi geliyor kullanıcının yapması gereken tek sey araya linki yazmak ama eğer link aşağı satıra inerse o zaman hata veriyor kontrolu render etmiyor yada ne bilem adam linki yazdıkdan sonra enter'a basarsa aşağı satıra iniyor ve şu sekilde gorunuyor
'EM'http://
'EM'
kontrol bu durumda da render olmuyor işte bu problemi cozemdim bir turlu şimdi farklı bir olayada kaymak istemiyorum neticede bir enter'a basıldığını yakalamam gerekiyor.
Şafak sen php biliyorsun orada da varmış regular expression denilen seyler ya yazdığım desen mi yanlış acaba yakalama olayı o zaman gercekleşmediğine gore ????





331. KSD
*.NET DEVELOPER




Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
07.04.2008-01:57 #41359
Zor bir şey yok, eğer sistemde POSIX desteği var ise [[:print:][:space:]]+ ifadesi "basılabilen karakterler OR boşluk karakterleri" kümesinden en az 1 eşleşme anlamıne geliyor. Kullandığın metodların eşleştirme sonunda ne ürettiğini bilmiyorum, bu bahsettiğim ifadeyi pattern stringi içinde parantez içinde belirtmen gerekiyor sanırım. Enter tuşuna basıldığını sadece LF ile yakalamak mümkün olmayabilir. Bir de CRLF olarak yakalamayı dene istersen.





Let`s make this world a better place to live !

Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
07.04.2008-11:41 #41380
clairvoyant yazdi
 
Zor bir şey yok, eğer sistemde POSIX desteği var ise [[:print:][:space:]]+ ifadesi "basılabilen karakterler OR boşluk karakterleri" kümesinden en az 1 eşleşme anlamıne geliyor. Kullandığın metodların eşleştirme sonunda ne ürettiğini bilmiyorum, bu bahsettiğim ifadeyi pattern stringi içinde parantez içinde belirtmen gerekiyor sanırım. Enter tuşuna basıldığını sadece LF ile yakalamak mümkün olmayabilir. Bir de CRLF olarak yakalamayı dene istersen.

Regex regular = new Regex("'EM'(.*?)'/EM'", RegexOptions.Compiled); işte pattern buradaki string
yani "'EM'(.*?)'/EM'" ben bu LF ve CRLF olayını senden duydum regular expression konusuna çok hakim değilim daha yeni başladım çünki bu sınıfı kullanmam gerekiyor.Ama çok geniş bir dünya olduğu aşikar
yazdığım pattern de 'EM' başlangıç tagı '/EM' de bitiş tagı aradaki (.*?) ise yazılabilecek karakterlerin hepsi manasında olması gerekiyor ben bunu bu diye düşünüyorum ama emin de değilim açıkcası posIx olayına dalmayım derim ben yinede bana ortaya yazacağım sey lazım "'EM'....'/EM'" patternin ortasına oyle bir sey yazmalıyım ki kullanıcı ne girerse girsin onu tamamen almalı.new line karakteri dahil :)





331. KSD
*.NET DEVELOPER




Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
07.04.2008-14:29 #41387
Problem RegexOptions'ı yanlış belirtmenden kaynaklanıyor. RegexOptions.Compiled yerine RegexOptions.Singleline yaparsan büyük ihtimalle sorunun çözülecektir.

Açıklayacak olursak:
- Nokta (.) yeni satır dışındaki bütün karakterlerin karşılaştırmasını yapar. Yani nokta (.) karakteri ters slash-n dışındaki bütün karakterleri temsil eder. Singleline modu bütün karakterleri karşılaştırır.

- Caret (^) stringin başlangıç pozisyonundan ya da yeni satırdan sonraki pozisyondan, dollar ($) stringin bitiş pozisyonuna ya da yeni satırdan önceki pozisyona kadar, bütün bir string karşılaştırması yapar. Multiline modunda işlem görülür.

Senin kullandığın compiled modu stringin derlenmiş halininin karşılaştırmasını yapıyor sanırım ve multiline modundaki gibi yeni satırı yakalayamıyorsun ya da yakalaman için farklı bir pattern belirtmen gerekiyordur orasını bilmiyorum.

Neyse uzattım. Singleline modunda dene bakalım o zaman yeni satırı yakalayacaktır.







Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
07.04.2008-16:18 #41395
Gökhan CRLF senin yabancı olduğun bir kavram değil. Karakter bunlar :)

CR: Carriage Return ("\r" -> ASCII 0x0A)
LF: Line Feed ("\n" -> ASCII 0x0D)

Kullandığın (.*?) ifadesi biraz anlamsız kalıyor. Buradaki nokta (.) karakterinin işlevini aliprinter açıklamış. Yıldız (*) karakteri ise solundaki karakter ya da karakter kümesi ile 0 veya daha fazla eşleşme anlamına geliyor. Soru işareti (?) solundaki karakter ya da karakter kümesi ile 0 veya 1 eşleşme anlamına geliyor. Dolayısıyla karmaşık bir ifade olmuş seninki. Belirlediğin bir kümenin sağına artı (+) işareti koyarak eşleştirme yapman daha uygun olur. Örneğin (.+) gibi bir ifade olabilir.

Önceki mesajımda yazdığım gibi POSIX desteği var ise ([[:print:][:space:]]+) gibi bir ifadeyle basılabilen ve her türlü boşluk karakterlerini yakalayabilirsin. Ya da hiç olmadı, olası bütün karakterleri yan yana getirerek bir küme oluşturabilirsin.
Sistem destekliyorsa [\x00-\xFF] ile 256 karakteri de eşleştirebilirsin. biggrin

Regular Expression (Türkçesi "düzenli deyim") ile ilgili temel bilgileri wikipedia'dan okuyabilirsin.

http://en.wikipedia.org/wiki/Regular_expression





Let`s make this world a better place to live !

Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
08.04.2008-02:32 #41554
clairvoyant yazdi
 
Gökhan CRLF senin yabancı olduğun bir kavram değil. Karakter bunlar :)

CR: Carriage Return (" " -> ASCII 0x0A)
LF: Line Feed ("
" -> ASCII 0x0D)

Kullandığın (.*?) ifadesi biraz anlamsız kalıyor. Buradaki nokta (.) karakterinin işlevini aliprinter açıklamış. Yıldız (*) karakteri ise solundaki karakter ya da karakter kümesi ile 0 veya daha fazla eşleşme anlamına geliyor. Soru işareti (?) solundaki karakter ya da karakter kümesi ile 0 veya 1 eşleşme anlamına geliyor. Dolayısıyla karmaşık bir ifade olmuş seninki. Belirlediğin bir kümenin sağına artı (+) işareti koyarak eşleştirme yapman daha uygun olur. Örneğin (.+) gibi bir ifade olabilir.

Önceki mesajımda yazdığım gibi POSIX desteği var ise ([[:print:][:space:]]+) gibi bir ifadeyle basılabilen ve her türlü boşluk karakterlerini yakalayabilirsin. Ya da hiç olmadı, olası bütün karakterleri yan yana getirerek bir küme oluşturabilirsin.
Sistem destekliyorsa [x00-xFF] ile 256 karakteri de eşleştirebilirsin. biggrin

Regular Expression (Türkçesi "düzenli deyim") ile ilgili temel bilgileri wikipedia'dan okuyabilirsin.

http://en.wikipedia.org/wiki/Regular_expression


 

Problem RegexOptions'ı yanlış belirtmenden kaynaklanıyor. RegexOptions.Compiled yerine RegexOptions.Singleline yaparsan büyük ihtimalle sorunun çözülecektir.

Açıklayacak olursak:
- Nokta (.) yeni satır dışındaki bütün karakterlerin karşılaştırmasını yapar. Yani nokta (.) karakteri ters slash-n dışındaki bütün karakterleri temsil eder. Singleline modu bütün karakterleri karşılaştırır.

- Caret (^) stringin başlangıç pozisyonundan ya da yeni satırdan sonraki pozisyondan, dollar ($) stringin bitiş pozisyonuna ya da yeni satırdan önceki pozisyona kadar, bütün bir string karşılaştırması yapar. Multiline modunda işlem görülür.

Senin kullandığın compiled modu stringin derlenmiş halininin karşılaştırmasını yapıyor sanırım ve multiline modundaki gibi yeni satırı yakalayamıyorsun ya da yakalaman için farklı bir pattern belirtmen gerekiyordur orasını bilmiyorum.

Neyse uzattım. Singleline modunda dene bakalım o zaman yeni satırı yakalayacaktır.

Bu ikisinin çok faydası oldu genel manada sorunumu çözdüm artık diğer seyleri implemente etmem gerekiyor uğraşcaz biraz bakalım ....Ama şablon çıkdı diyebilirim yanlışlığı söylemek gerekirse öncelikle [] arasında tanımlama yapmayı denedim bu durumda iki tag arasında yazılan stringi yakalayamıyordum.Yani sorun buyuyordum bu durumu çözmek icin 'tag' '/tag' seklinde bir yapı tanımladım bu seferde alt satırda sorunlar çıkıyordu bu sorunuda arkadaşım sağ olsun .SingleLine options ile yakaladım son olarak ise Şafak sağ ol gercekden türkce kaynaklar berbatmış bunu gordum attığın link sayesinde ufkum açıldı biraz daha (Regular expressions ) konusuna dair. Gercekden çok zevkli ve bir o kadar güzel şeyler çıkartılabilecek bir konu...Aşağıda bu işlemleri yapan HtmlConvertor classım bulunmakda genel manada data base e bir tml tagının ozelliklerini kayıt ediyor ve ilgili forum konusu secilince o sayfadaki mesajları render ederken eğer mesajların içeriğinde bu html tagları da varsa onlarıda render ediyor ve kullanıcıya daha goze hos gelen bir sekil sunuyor.Herkeze yardımları için teşekkür ederim ...Kodun şuanki durumunda patlayabileceği tek nokta iç içe geçmiş kontroller konusunda ne yapacağını bilmemesi o konuya şu saatten sonra girmek istemiyorum yeterince başım ağrıdı zaten.talk to the handtalk to the hand

 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;

/// <summary>
/// Summary description for HtmlEditor
/// </summary>
public class HtmlEditor
{
private MatchCollection GetTagContent(ref TextBox source, string tag)
{

string pattern = "'" + tag + "'(.*?)'/" + tag + "'";
Regex regex = new Regex(pattern, RegexOptions.Singleline);
MatchCollection mc = regex.Matches(source.Text);
return mc;
}

public void ConvertYoutubeVideo(ref TextBox source)
{
MatchCollection mc = GetTagContent(ref source, "EM");
Regex regular = new Regex("'EM'(.*?)'/EM'", RegexOptions.Singleline);
foreach(Match matches in mc)
{
string url = matches.Groups[1].Value;
string place = "<EMBED SRC=" + url + " HEIGHT=330 WIDTH=330 ></EMBED><br/><br/>";
source.Text = regular.Replace(source.Text, place,1);
}

}
public void ConvertQuote(ref TextBox source)
{

MatchCollection mc = GetTagContent(ref source, "QU");
Regex regular = new Regex("'QU'(.*?)'/QU'", RegexOptions.Singleline);
string text="0";
foreach(Match matches in mc)
{
text = matches.Groups[1].Value;
string stil = ""background-color: silver; width: 411px; height: 119px;"";
string place = "<table style=" + stil + "; ><tr><td colspan=3 rowspan=3 style=width: 6px>" + text + "</td></tr></table><br/><br/>";
source.Text = regular.Replace(source.Text, place,1);

}

}
public void ConvertCodeField(ref TextBox source)
{

MatchCollection mc = GetTagContent(ref source, "CD");
Regex regular = new Regex("'CD'(.*?)'/CD'", RegexOptions.Singleline);
string text = "0";
foreach (Match matches in mc)
{
text = matches.Groups[1].Value;
string stil = ""background-color: white; width: 411px; height: 119px;"";
string place = "<textarea id=TextAreaCode cols=70 rows=5 readonly=readOnly style=" + stil + ">" + text + "</textarea><br/><br/>";
source.Text = regular.Replace(source.Text, place,1);
}

}
}






331. KSD
*.NET DEVELOPER




Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb