Reactie plaatsen 
 
Waardering:
  • 0 stemmen - gemiddelde waardering is 0
  • 1
  • 2
  • 3
  • 4
  • 5
Html tekst splitten
Auteur Bericht
ufeg02 Offline
Member
***

Berichten: 61
Lid sinds: 04-2007
Reputatie: 0
Bericht: #1
Html tekst splitten
Ik heb het volgende probleem. In mijn database sla ik nieuwsberichten op in HTML. Dus met de nodige div-s, p-s etc...

Nu wil ik op mijn homepage slechts een verkorte versie van dat artikel weergeven. Dus bijvoorbeeld enkel de eerste 500letters. Als ik dat hele artikel split worden niet alle tags afgesloten waardoor de opmaak van mijn frontpage dus niet meer in orde is.

Dus hoe kan ik nu een korte versie tonen op de frontpage, nog steeds met de correcte opmaak en afgesloten tags?
17-08-2009 08:05:09
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Ikke Offline
De enige echte
******

Berichten: 3.005
Lid sinds: 04-2006
Reputatie: 67
Bericht: #2
RE: Html tekst splitten
Je zult het HTML moeten parsen, zodat precies duidelijk is wat behouden moet blijven, en wat verkort mag worden.

- OOP: Make simple things complex to make complex things simple
- Op deze planeet is stompzinnigheid nu eenmaal overvloediger dan zuurstof.
- The most constant factor of software is change
17-08-2009 09:31:33
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Cuve Afwezig
Netlog Web Developer
*****

Berichten: 5.194
Lid sinds: 04-2006
Reputatie: 151
Bericht: #3
RE: Html tekst splitten
Dit is een functie waar tags gecheckt worden in PHP, dit kan je mss een idee geven om zelf iets te maken, en zo alle ontbrekende tags zelf toe te voegen.
(Via regexps dus):

PHP-code:
preg_match_all("/(<\w+)(?:.){0,}?>/"$str$v1);
    
preg_match_all("/<\/\w+>/"$str$v2);
    
$open array_map('strtolower'$v1[1]);
    
$closed array_map('strtolower'$v2[0]);
    foreach (
$open as $tag)
    {
        
$end_tag preg_replace("/<(.*)/""</$1>"$tag);
        if (!
in_array($end_tag$closed)) return true;
        unset(
$closed[array_search($end_tag$closed)]);
    }
    return 
false

20-08-2009 15:42:00
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
HvdC Afwezig
Not much of a legend!
***

Berichten: 78
Lid sinds: 04-2006
Reputatie: 0
Bericht: #4
RE: Html tekst splitten
Ik vond dit een leuke vraag, omdat er zo veel manieren zijn om dit uit te programmeren!



Mijn poging (C#):
PHP-code:
public static class Methods
    
{
        public static 
XNode BreathFirstSelection(this XNode rootint maxLength)
        {
            
//input validatie
            
if (root == null || maxLength 0) return root

            if (
root is XElement)
            {
                var 
childs OptimisticNodesSelection(rootmaxLength);
                (
root as XElement).ReplaceNodes(childs);

                if (
root.GetLength() > maxLength )
                {                    
                    
int maxLengthOfLastNode childs[childs.Count 1].GetLength() - (root.GetLength() - maxLength);
                    
childs[childs.Count 1] = BreathFirstSelection(childs[childs.Count 1], maxLengthOfLastNode);
                    (
root as XElement).ReplaceNodes(childs);
                }                
            }
            if (
root is XText)
            {
                if (
root.GetLength() > maxLength)
                    
root = new XText(root.GetValue().Remove(maxLength));
            }
            return 
root;
        }

        private static List<
XNodeOptimisticNodesSelection(XNode rootint maxLength)
        {
            
int tempRootLength 0;
            var 
childs = (root as XElement).Nodes().TakeWhile(=>
            {
                
bool addCurrentNode tempRootLength maxLength;
                if (
addCurrentNode)
                    
tempRootLength += n.GetLength();
                return 
addCurrentNode;
            }).
ToList();
            return 
childs;
        }

        public static 
string GetValue(this XNode node)
        {
            
//valideer input
            
if (node == null) throw new ArgumentNullException("node");

            
string result string.Empty;
            if (
node is XElement)
                
result = (node as XElement).Value;
            else if (
node is XText)
                
result = (node as XText).Value;
            else
                throw new 
ArgumentException("The provided node was of unexpected type!");
            return 
result;
        }

        public static 
int GetLength(this XNode node)
        {
            
//valideer input
            
if (node == null) throw new ArgumentNullException("node");

            return 
node.GetValue().Length;
        }
    } 

Ik hoop dat het er een beetje toonbaar uit blijft zien, en ik ben benieuwd naar je ervaringen met deze code en jouw XML berichten. :)

Het reputatiesysteem slaat op niets! :-)
(Dit bericht is het laatst bewerkt op 22-10-2009 om 11:18:08 door HvdC.)
21-10-2009 23:08:09
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
HvdC Afwezig
Not much of a legend!
***

Berichten: 78
Lid sinds: 04-2006
Reputatie: 0
Bericht: #5
RE: Html tekst splitten
Iets minder hip, maar waarschijnlijk net zo gemakkelijk om te begrijpen, is de XMLReader variant:

PHP-code:
namespace ConsoleApplication1
{
    class 
Program
    
{
        static 
void Main(string[] args)
        {
            
string path Path.Combine(Environment.CurrentDirectory"Article.xml");

            
XmlReader reader XmlReader.Create(path, new XmlReaderSettings() { IgnoreWhitespace trueCloseInput true });
            
XmlDocument doc AbbreviateWithXmlReader(reader80);
            
XmlTextWriter writer = new XmlTextWriter(Console.Out) { Formatting Formatting.Indented };
            
doc.WriteTo(writer);
            
Console.ReadLine();
        }

        public static 
XmlDocument AbbreviateWithXmlReader(XmlReader readerint maxLength)
        {            
            
XmlDocument doc = new XmlDocument();
            
XmlNode currentNode doc;


            while (
reader.Read() && doc.InnerText.Length maxLength)
            {
                switch (
reader.NodeType)
                {
                    case 
XmlNodeType.Text:
                        
int visibleNrOfCharacters Math.Max(Math.Min(reader.Value.LengthmaxLength doc.InnerText.Length), 0);
                        
                        
string text reader.Value;
                        if (
visibleNrOfCharacters text.Length)
                        {
                            
text text.Remove(visibleNrOfCharacters);
                            
text += "...";
                        }
                        
                        
XmlNode newTextNode doc.CreateTextNode(text);
                        
currentNode.AppendChild(newTextNode);                        
                        break;

                    case 
XmlNodeType.Element:
                        
XmlElement newElement doc.CreateElement(reader.Name);

                        if (
reader.HasAttributes)
                        {
                            
int attribCount reader.AttributeCount;
                            for (
int i 0attribCounti++)
                            {
                                
reader.MoveToAttribute(i);
                                
newElement.SetAttribute(reader.Namereader.Value);
                            }
                        }

                        
currentNode.AppendChild(newElement);
                        
currentNode newElement;
                        break;

                    case 
XmlNodeType.EndElement:
                        
currentNode currentNode.ParentNode;
                        break;

                    default: break;
                }
            }
            return 
doc;
        }
    }


Ik ga er van uit dat je met deze twee voorbeelden wel verder kunt?

Het reputatiesysteem slaat op niets! :-)
(Dit bericht is het laatst bewerkt op 22-10-2009 om 11:20:30 door HvdC.)
22-10-2009 03:47:10
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Reactie plaatsen 


Ga naar locatie:


Contact opnemen | Ep2 | Naar boven | Naar inhoud | Archiefmodus | RSS-syndicatie