strip_tags sorununa gelişmiş çözüm

PHP ile haşır neşir olan hemen herkesin bildiği ve belki özel işlerde kullandığımız strip_tags fonksiyonunda yaşadığım sorundan ve bu konuyla alakalı çözümümden bahsedeceğim.

Konuya girmeden önce özellikle W3C  ( Dünya Çapında Ağ Birliği )’nin sunduğu HTML standartlarına sitenizdeki tüm sayfaların uyması gerektiğini ara ara yaptığınız değişiklikleri W3C Validator sayfasından kontrol etmeniz gerektiğini hatırlatmak isterim.

strip_tags fonksiyonu belirtilen html etiketlerinin ( html tags ) içeriğinin temizlenerek yalın halini vermeye, html kodlamasını ayıklarak sadece içeriğin çıkmasını sağlamasına yaramaktadır. Genelde kullanım alanı olarak bot yapımında aktiftir.

Yaşadığım sorun: W3C standartına uygun olmayan sitelerin içeriklerini çektikten sonra strip_tags fonksiyonunu kullanarak almaya çalıştığım içerikte sorun oluşuyordu. Sayfadaki eksik ya da kapatılmamış html etiketlerinden dolayı yazılar sanki etiketin özelliği veya içeriğiymiş gibi strip_tags fonksiyonuyla gelmiyordu.

Bunu aşağıdaki kodlamada kullanılan gelişmiş preg_match fonksiyonuyla çözüm getirdim. Bu şekilde düzensiz olan veya unutulan html etiketlerindeki yazıları artık alabiliyorum.

function strip_HTML_tags($text){ // Strips HTML 4.01 start and end tags. Preserves contents.
		return preg_replace('%
			# Match an opening or closing HTML 4.01 tag.
			</?                  # Tag opening "<" delimiter.
			(?:                  # Group for HTML 4.01 tags.
			  ABBR|ACRONYM|ADDRESS|APPLET|AREA|A|BASE|BASEFONT|BDO|BIG|
			  BLOCKQUOTE|BODY|BR|BUTTON|B|CAPTION|CENTER|CITE|CODE|COL|
			  COLGROUP|DD|DEL|DFN|DIR|DIV|DL|DT|EM|FIELDSET|FONT|FORM|
			  FRAME|FRAMESET|H\d|HEAD|HR|HTML|IFRAME|IMG|INPUT|INS|
			  ISINDEX|I|KBD|LABEL|LEGEND|LI|LINK|MAP|MENU|META|NOFRAMES|
			  NOSCRIPT|OBJECT|OL|OPTGROUP|OPTION|PARAM|PRE|P|Q|SAMP|
			  SCRIPT|SELECT|SMALL|SPAN|STRIKE|STRONG|STYLE|SUB|SUP|S|
			  TABLE|TD|TBODY|TEXTAREA|TFOOT|TH|THEAD|TITLE|TR|TT|U|UL|VAR
			)\b                  # End group of tag name alternative.
			(?:                  # Non-capture group for optional attribute(s).
			  \s+                # Attributes must be separated by whitespace.
			  [\w\-.:]+          # Attribute name is required for attr=value pair.
			  (?:                # Non-capture group for optional attribute value.
				\s*=\s*          # Name and value separated by "=" and optional ws.
				(?:              # Non-capture group for attrib value alternatives.
				  "[^"]*"        # Double quoted string.
				| \'[^\']*\'     # Single quoted string.
				| [\w\-.:]+      # Non-quoted attrib value can be A-Z0-9-._:
				)                # End of attribute value alternatives.
			  )?                 # Attribute value is optional.
			)*                   # Allow zero or more attribute=value pairs
			\s*                  # Whitespace is allowed before closing delimiter.
			/?                   # Tag may be empty (with self-closing "/>" sequence.
			>                    # Opening tag closing ">" delimiter.
			| <!--.*?-->         # Or a (non-SGML compliant) HTML comment.
			| <!DOCTYPE[^>]*>    # Or a DOCTYPE.
			%six', '', $text);
	}

Paylaş: