Konkurs JS & PHP !!! [ROZwiązany]

0

Witam serdecznie.

Zapraszam wszystkich koderów do konkursu.

Zadaniem uczestnika jest napisanie funkcji w języku JavaScript lub PHP o nazwie closeTags() przyjmującej jeden argument str.

Funkcja ma zwrócić ciąg znaków (str) w którym wszystkie otwarte Tagi HTML zostaną zamknięte.

Dla ułatwienia nie trzeba ich zamykać w odpowiedniej kolejności. Wystarczy żeby ilość znaczników otwierających i zamykających była taka sama tzn. że odpowiednie Tagi zamykające trzeba dopisać na końcu zmiennej str.

Przykład:

Wprowadzamy do funkcji taki tekst:

text<b style="">text</u>
text
</b>text</u>text<u>text
</b>text<b>
text<u onclick="">text<b>text
</b>text<b>
texttext</u>text<u>text

A ona zwraca go dodając jeszcze:

</b></b></u></u>

Wygrywa pierwsze poprawne rozwiązanie wklejone na forum.

Życzę owocnego kodowania...

0
<?
  function closeTags($s)
  {
     $expr = '#<([^>\s]+)\s*([^>]*)>#';
     preg_match_all($expr, $s, $matches, PREG_SET_ORDER);

     $opened = array();
     for ($i = 0; $i < count($matches); $i ++)
     {
        $opened[(string)$matches[$i][1]] ++;
     }

     $expr = '#</([^>]+)>#';
     preg_match_all($expr, $s, $matches, PREG_PATTERN_ORDER);

     for ($i = 0; $i < count($matches); $i ++)
     {
        $opened[(string)$matches[$i][0]] --;
     }
     
     foreach ($opened as $tag => $count)
     {
        if ($count >= 1)
        {
           $s .= str_repeat('</' . $tag . '>', $count);
        }
     }
     
     return $s;
  }


  $text = '<b>cos<font style="blble"><tag><inny tag ze spacjami>tekst';

  echo('<pre>' . htmlspecialchars($text) . '</pre><br />');
  echo('<pre>' . htmlspecialchars(closeTags($text)) . '</pre><br />');
?>

Przed chwila mi sie przypomnialo i jeszcze mozliwosc napisania w php, wiec oto jestem.

0

Witam pierwszego śmiałka, rozwiązanie wygląda na dobre więc postanowiłem wstawić do tego konkursowy przykład i otrzymałem:

text<b style="">text</u>
text
</b>text</u>text<u>text
</b>text<b>
text<u onclick="">text<b>text
</b>text<b>
texttext</u>text<u>text
</b></b></b></b><//u><//u><//u><//b><//b><//b></u></u>

powinno dodać jedynie dwa b i dwa u, wiec mimo szczerych chęci nie mogę tego uznać ;(

0

Ooo, ktoś odpowiedział - a miełem być pierwszy :P

Poniższy kod należałoby wzbogacić o listę tagów, których się nie zamyka (np. <input> etc.)

<?
function closeTags($t)
{
	preg_match_all ( '#<(/)?([a-z]+)[^>]*>#', $t, $full , PREG_OFFSET_CAPTURE | PREG_SET_ORDER);

	$c = count($full);
	for ($i = 0; $i < $c; $i++)
		if ( $full[$i][1][1] == -1 )
			$tags[$full[$i][2][0]]++;
		elseif ( $tags[$full[$i][2][0]] > 0 )
			$tags[$full[$i][2][0]]--;

	foreach ($tags as $tag => $c)
		for ($i = 0; $i < $c; $i++)
			$end .= '</' . $tag . '>';

	return $t . $end;
}

$txt = 'text1<b style="">text2</u>
text3
</b>text4</u>text5<u>text6
</b>text7<b>
text8<u onclick="">text9<b>text10
</b>text11<b>
texttext12</u>text13<u>text14';

echo closeTags($txt);
echo '<br><br>';
echo htmlspecialchars(closeTags($txt));

echo '<br><br>text testowy - powinien byc bez styli';
?>
0

Gratulacje !!!

Trochę miałem problemów z oceną funkcji, ponieważ mam za stare PHP żeby tak zmutować preg_match_all() :D ale jakoś na sucho to obadałem no i gratuluje pomysłu jak i algorytmu.

Zwycięzcą konkursu zostaje Marooned

Ja tu żeby nie było ze jestem gorszy wkleję rozwiązanie w JS, ale algorytm jest, że tak powiem, prostacki przy twoim [wstyd]

  function closeTags(str) {

    var tags = ['input', 'br', 'hr']; // tagi do pominiecia

    function countOpenTags(str, tag) {
      str = str.replace(/[\s]+/g, ' ');
      var rE1 = new RegExp('<' + tag + '( .*?)?>', 'gi');
      var tmp = '<' + tag + '( .*?)?>(.*?)</' + tag + '( .*?)?>';  
      var rE2 = new RegExp(tmp, 'i');
      while (str.match(rE2)) str = str.replace(rE2, '$2');
      return (tmp = str.match(rE1)) ? tmp.length : 0; 
    }

    var tmp = tags.length;
    str.replace(/<([\w]+).*?>/gi, function(r, s) {
      for (var i = 0; i < tags.length; i++) {
        if (tags[i].match(new RegExp('^' + s + '$', 'i'))) return;
      }
      tags[tags.length] = s;
    } );
    tags = tags.slice(tmp).reverse();

    for (var i = 0, j; i < tags.length; i++) {
      j = countOpenTags(str, tags[i]);
      while (j--) str += '</' + tags[i] + '>';
    }

    return str;
  }
0

Ah, pomylka:

<?
  function closeTags($s)
  {
     $expr = '#<([^>\s]+)\s*([^>]*)>#';
     preg_match_all($expr, $s, $matches, PREG_SET_ORDER);

     $opened = array();
     for ($i = 0; $i < count($matches); $i ++)
     {
        $opened[(string)$matches[$i][1]] ++;
     }

     $expr = '#</([^>]+)>#';
     preg_match_all($expr, $s, $matches, PREG_PATTERN_ORDER);

     for ($i = 0; $i < count($matches); $i ++)
     {
        $opened[(string)$matches[$i][<b>1</b>]] --;
     }
     
     foreach ($opened as $tag => $count)
     {
        if ($count >= 1)
        {
           $s .= str_repeat('</' . $tag . '>', $count);
        }
     }
     
     return $s;
  }


  $text = '<b>cos<font style="blble"><tag><inny tag ze spacjami>tekst';

  echo('<pre>' . htmlspecialchars($text) . '</pre><br />');
  echo('<pre>' . htmlspecialchars(closeTags($text)) . '</pre><br />');
?>

Powinno smigac (choc nie mam jak sprawdzic) :P

Gratulacje Marooned :)

0

Hehe, dobrze wyczułem skąd ten konkurs [diabel].

Dzięki za uznanie. Algorytm mi się przyśnił ;)

Kurna, myślałem że kumam JS, ale jak patrzę na kod piechnata to czuję grozę [green].

Niedługo użytkownicy 4programmers będą nic nawet o tym nie wiedząc wykorzystywać ten kod kilkaset razy dziennie :)

P.S.
Więcej takich konkursów!! Czyli nie rozlazłych programów czy też jak na olimpiadach: idiotycznych zagadnień, których nikt nie używa - tu było super: krótko, zwięźle i użytecznie - piona za pomysł!

P.S.2
ekhm... a co wygrałem? :d

0
Marooned napisał(a)

piona za pomysł!

Tylko zeby bylo uzytecznie i oryginalnie, bo ja mialem gotowca akurat do tego i pomyslalem ze to by bylo nie fair z mojej strony nawet gdybym probowal sam cos wymyslec.

0

To zapodaj gotowca - już nie do konkursu, ale może lepszy od naszych pomysłów. Może ktoś będzie kiedyś tego szukał to dostanie wybór :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1