PDA

View Full Version : حرفه ای: نمایش خلاصه متن ذخیره شده در Database که در یک ادیتور نوشته شده است



meisam3322
پنج شنبه 03 آذر 1390, 10:27 صبح
با سلام،

بچه ها من تعدادی متن که با یک ادیتور مثل tinymce نوشته شده رو تو بانک دخیره کردم. حلال این متن ها رو می خوام فقط چند خط شون رو توی صفحه نمایش بدم که کاربر با کلیک برروی دکمه ادامه ، در صفحه دیگه کل متن رو بخونه.

حالا مشکل من اینه که برای خلاصه کردن از این روش استفاده کردم که برنامه جهت خلاصه مطلب فقط مثلا 200 کارکتر رو بخونه و نمایش بده، ولی مشکلی که هست شاید کارکتر 200 ام یه تگ باشه مثل "<" که حالت نمایش متن به هم میریزه.

میتونین راهنماییم کنین ؟

ممنون

aliyeh
پنج شنبه 03 آذر 1390, 11:58 صبح
دوست خوبم حتی اگه بتونی یکسری کاراکترهای کنترلی متن رو تشخیص بدی باز هم یه جای کار اشکال پیدا میکنه. مثلا فرض کن که کراکتر 200 حرف اول یا دوم یک کلمه باشه،این باعث نا خوانا شدن میشه. تازه اگه بتونی این حروف رو نادیده بگیری اگه در متن اصلیت از این حروف استفاده شده بود چی؟
یه راه شاید این باشه که اطلاعات رو در یک کنترلی بریزی که این تگ ها رو تشخصی میده(مثلا textbox همه حروف رو نشون میده ولی lable متن رو با فرمت نشون میده) و بعد از داخل اون 200 تا کراکتر اول رو بخونی.
ولی راهی که بعضی سایت های خبری مثل رجانیوز و ... استفاده می کنند این هست که قسمت خلاصه خبر رو جدا در نظر میگیرن و فیلدش جدا از متن اصلی خبر هستش.

مهدی کرامتی
پنج شنبه 03 آذر 1390, 12:01 عصر
من هم همیشه خلاصه متن را در یک فیلد جداگانه ذخیره می کنم.

Saman Hashemi
پنج شنبه 03 آذر 1390, 12:15 عصر
راهش اینه آقای کرامتی گفت اما اگر نمیخوایی این کار انجام یه کم دردسر داره باید یه کلاس بنویسی که اول تمام متن بگیره هر چی بین <> هست پاک کنه بعد بیشتر از اون مقداری که میخوایی از متن جدا کنه مثلا 220 بعد اولین نقطه یا space بعد از 200 کاراکتر رسید متوقف شه رشته برگردونه...!

sg.programmer
پنج شنبه 03 آذر 1390, 14:19 عصر
از دستور substring در کوئری ات استفاده کن



SUBSTRING ( value_expression , start_expression , length_expression )



SELECT LastName, SUBSTRING(FirstName, 1, 200) AS Initial
FROM Person.Person
WHERE LastName like 'Barl%'
ORDER BY LastName;

rana-writes
پنج شنبه 03 آذر 1390, 14:47 عصر
سلام
به نظرم همونطور كه آقاي كرامتي گفتن عمل كنين
چون من يه نرم افزار مربوط به يه جاي خاصي كه قرار بود براي خبرگزاريها كار كنن و جاي بزرگي هم بود ديدم اونم كلا يه بخش رو براي خلاصه مطلب در نظر گرفته بود
با سردبير يكي از مجله هاي الكترونيكي بزرگ هم كه صحبت ميكردم، اونا هم موقع درج خبر، يه بخشي رو براي درج خلاصه خبر گذاشتن

موفق باشين

fakhravari
جمعه 04 آذر 1390, 02:36 صبح
با سلام
من ساب استرینگ با یگ لیبل با دستور دیتاروباند گرید کار میکنم.
ابا روشی هست که مستقیم به دیتا رو دیگر کار تداشته باشیم و بتوان با دادن مقدار در ساب استرینگ در لیبل ان را درست کرد؟

hakan648
جمعه 04 آذر 1390, 02:50 صبح
سلام
بنده یک کلاس برای کار با متن نوشتم
موردی که نیاز دارید در متد GetSummaryOfText وجود داره
امیدوارم مفید باشه ...

Imports Microsoft.VisualBasic
Imports System.Text.RegularExpressions
Imports System.Security.Cryptography
Imports System
Imports System.Text

Public Class StringTools

Public Function GetMd5Hash(ByVal input As String) As String
' Convert the input string to a byte array and compute the hash.
Dim md5Hash As MD5 = MD5.Create()
Dim data() As Byte = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input))

' Create a new Stringbuilder to collect the bytes
' and create a string.
Dim sBuilder As New StringBuilder()

' Loop through each byte of the hashed data
' and format each one as a hexadecimal string.
For i As Integer = 0 To data.Length - 1
sBuilder.Append(data(i).ToString("x2"))
Next i

' Return the hexadecimal string.
Return sBuilder.ToString()
End Function



Public Function GetSummaryOfText(ByVal Val As String, ByVal Len As String) As String
Dim Value As String = Regex.Replace(Val, "\<(/?[^\>]+)\>", String.Empty)
If Value.Length > Len Then
Value = Value.Remove(Len, Value.Length - Len)
Value = Value.Insert(Value.Length, " ...")
End If
Return Value
End Function

Public Function GetRandomPass() As String
Dim Text As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim Number As String = "1234567890"
Dim rnd As New Random
Dim Out As String = ""
Dim i As Integer = 0
Do While i <= 5
Out &= Text.Substring(rnd.Next(1, 22), 1)
Out &= Number.Substring(rnd.Next(1, 9), 1)
i += 1
Loop
Return Out
End Function

Public Function GetHashedRandomCode() As String
Dim rand1, rand2 As New Random
Dim Randstr As String = rand1.Next(1000) & rand2.Next(1000) & Now
Dim ranpas As String = GetMd5Hash(Randstr)
Return ranpas
End Function

End Class


موفق باشید ...

fakhravari
جمعه 04 آذر 1390, 14:32 عصر
با سلام
public static string GetSummaryOfText(string Val, string Len)
{
string Value = Regex.Replace(Val, "\\<(/?[^\\>]+)\\>", string.Empty);
if (Value.Length > Int32.Parse(Len))
{
Value = Value.Remove(Int32.Parse(Len), Value.Length - Int32.Parse(Len));
Value = Value.Insert(Value.Length, " ...");
}
return Value;
}
اگر درست تبدیل کرده باشم.
جالا به چه شکل روی Eval("Subject") اعمال کنم.

hakan648
چهارشنبه 09 آذر 1390, 10:59 صبح
سلام


GetSummaryOfText(Eval("Subject"),200)

moslem.hady
چهارشنبه 09 آذر 1390, 12:16 عصر
من از این تابع ها استفاده میکنم:

private string GetPlainTextFromHtml(string Html)
{
return Regex.Replace(Html, "<[^>]*>", string.Empty);
}

public string SubStringText(object InputText, object StartIndex, object Length)
{
string StrText = InputText.ToString();
int StrLenght = Convert.ToInt32(Length);
if (StrText.Length > StrLenght)
{
return StrText.Substring(Convert.ToInt32(StartIndex), StrLenght) + " ... ";
}
else
{
return StrText;
}
}
public string SubStringHtml(object InputHtml, object StartIndex, object Length)
{
return SubStringText(GetPlainTextFromHtml(InputHtml.ToStr ing()), StartIndex, Length);
}
تابع اول تگ های html متن رو پاک میکنه. تابع دوم همون substringه. و با تابع سوم متن htmlدار رو کوتاه میکنم.


<%# SubStringHtml(Eval("text").ToString(),0,200)%>

fakhravari
چهارشنبه 09 آذر 1390, 13:49 عصر
با سلام moslem.hady (http://barnamenevis.org/member.php?98192-moslem.hady)
اگر این کد بالا را در کلاس بزاریم چگونه باید استفاده شود. باید از نوع static باشد:متفکر:

moslem.hady
چهارشنبه 09 آذر 1390, 15:04 عصر
ینی چی چگونه استفاده شود؟!! من دقیقا همون کدی رو که تو برنامم بود اینجا گذاشتم. ینی کار کردن باهاش همینطوریه دیگه!!

fakhravari
چهارشنبه 09 آذر 1390, 15:26 عصر
من کد شما رو در یک کلاس به نام Class1 گذاشتم .
حالا چطوری فراخونی کنم.

meisam3322
چهارشنبه 09 آذر 1390, 16:05 عصر
من کد شما رو در یک کلاس به نام Class1 گذاشتم .
حالا چطوری فراخونی کنم.

دوست عزیز برای فراخوانی کلاس به این صورت عمل کن :

Dim _Class As New Class1

حالا تمامی آیتم های کلاس رو در اختیار داری:

fakhravari
چهارشنبه 09 آذر 1390, 17:01 عصر
با سلام
فکر نکنم چون در کد html فقط باید باند شود.
فکر کنم توی مایه های <%# Class1.SubStringHtml(Eval("CategoryName").ToString(), 0, 200)%>
نیازی به new کردن Class1 نیست.
فکر کنم با قسمت RowDataBound هستید
Dim _Class As New Class1
C# :بامزه: