PHP trích xuất các thẻ HTML từ chuỗi

À vâng, nếu bạn đọc hướng dẫn mà tôi đã liên kết đến, bạn sẽ hiểu tại sao. Quên tất cả về điều đó. Hàm trả về số lượng khớp mẫu đầy đủ. Bản thân các trận đấu được trả lại bằng $arr


$results = preg_match_all['~]*?]>~', 'example: 

this is a test

', $arr]; echo 'number of matches : ' . $results . '
'; echo 'matches : '; print_r[$arr];

Strip_tags[] là một hàm cho phép bạn loại bỏ tất cả các thẻ HTML và PHP khỏi một chuỗi đã cho [tham số một], tuy nhiên, bạn cũng có thể sử dụng tham số hai để chỉ định danh sách các thẻ HTML mà bạn muốn

Chức năng này có thể rất hữu ích nếu bạn từng hiển thị đầu vào của người dùng trên trang web của mình. Ví dụ: nếu bạn tạo diễn đàn bảng tin của riêng mình trên trang web của mình, người dùng có thể đăng tiêu đề dọc theo dòng

TRANG WEB NÀY HẤP DẪN. , bởi vì bạn sẽ hiển thị tiêu đề của mỗi bài đăng trên bảng của mình, sẽ hiển thị thông báo không mong muốn của họ bằng các chữ cái lớn trên màn hình của khách truy cập của bạn

Dưới đây là hai ví dụ về tước thẻ

Hello!";
    $a = strip_tags[$input];
    $b = strip_tags[$input, ""];
?>

Sau khi chạy tập lệnh đó, $a sẽ được đặt thành "Xin chào. ", trong khi $b sẽ được đặt thành "Xin chào. " bởi vì chúng tôi đã có "" trong danh sách các thẻ được chấp nhận. Sử dụng phương pháp này, bạn có thể loại bỏ hầu hết người dùng khỏi việc thay đổi bất lợi phong cách trang web của bạn, tuy nhiên, người dùng vẫn có thể gây rắc rối nếu bạn cho phép một danh sách các thẻ HTML nhất định, ví dụ: chúng tôi có thể lạm dụng thẻ allow bằng CSS. TRANG WEB NÀY HẤP DẪN

Nếu bạn cho phép thẻ, bạn cho phép tất cả các thẻ, bất kể chúng có thêm bất kỳ thông tin không mong muốn nào trong đó hay không, vì vậy tốt nhất là không cho phép bất kỳ thẻ nào

Bạn muốn học PHP 7?

Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay

Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó

❮ Tham chiếu chuỗi PHP

Ví dụ

Tách chuỗi khỏi thẻ HTML

echo strip_tags["Chào thế giới. "];
?>

Tự mình thử »

Định nghĩa và cách sử dụng

Hàm strip_tags[] tách một chuỗi khỏi các thẻ HTML, XML và PHP

Ghi chú. Nhận xét HTML luôn bị tước. Điều này không thể thay đổi với tham số allow

Ghi chú. Hàm này an toàn nhị phân

cú pháp

Giá trị tham số

Tham sốChuỗi mô tảBắt buộc. Chỉ định chuỗi để checkallowOptional. Chỉ định các thẻ được phép. Các thẻ này sẽ không bị xóa

chi tiết kỹ thuật

Giá trị trả về. Trả về chuỗi bị tước Phiên bản PHP. 4+Nhật ký thay đổi. Kể từ PHP 5. 3. 4, hàm này bỏ qua các thẻ XHTML tự đóng [như
] trong tham số cho phép
Kể từ PHP 5. 0, chức năng này an toàn nhị phân.
Kể từ PHP 4. 3, Nhận xét HTML luôn bị xóa.

Thêm ví dụ

Ví dụ

Tách chuỗi khỏi thẻ HTML, nhưng cho phép sử dụng thẻ

echo strip_tags["Chào thế giới. ",""];
?>

Tự mình thử »

❮ Tham chiếu chuỗi PHP

Tôi muốn trích xuất các thẻ HTML và nội dung của nó từ một chuỗi. Nội dung [đầu vào] được truy vấn từ cơ sở dữ liệu WordPress

Dữ liệu mẫu [đầu vào]

Tôi trích xuất dữ liệu giả này từ cơ sở dữ liệu WordPress của mình. https. //www. php regex trực tiếp. com/p/tan
Tôi tin rằng điều này sẽ bao gồm tất cả các thẻ cần thiết để phân tích cú pháp.

Kỳ vọng [đầu ra]

Chấp nhận chuỗi định dạng HTML làm đầu vào. Đầu ra sẽ có thể trả về một chuỗi có thể là bất kỳ chuỗi nào trong số này

  1. Bản thân chuỗi phần tử HTML
  2. Chuỗi thuộc tính của phần tử HTML
  3. Các nút văn bản, chuỗi nút con của phần tử HTML

Nỗi lo của tôi

  • Giải pháp nào mất ít thời gian thực hiện hơn?
  • Giải pháp nào tiết kiệm bộ nhớ máy chủ hơn?
  • Lỗ hổng bảo mật của từng giải pháp

Tôi đã tự nghĩ ra 2 giải pháp. Nó hoạt động tốt, nhưng tôi không biết cái nào tốt cho trường hợp của mình

$el = 'li'; // Ex
$match = []; // Reserving for results

/**
 * Regex - extract HTML tag and its content
 * Array map:
 * x[0] = everything
 * x[1] = open tag
 * x[2] = attributes
 * x[3] = content & end tag
 * x[4] = content only
 * 
 * Note for content: including text node + children node
 */
$reg = '/[][[\n*?.*?\n*?]|]/';

if [preg_match[$reg, $html_str, $match]] { echo 'Moving onward!';}

Kết quả. xem bản demo của regex

$dom = new DomDocument[];
$content = mb_convert_encoding[
    get_the_content[null, true], # WordPress func, it gives input str
    'HTML-ENTITIES',
    'UTF-8'
];
$dom->loadHTML[$content];

$el = $doc->getElementsByTagName['li'];

Kết quả. trả về một DOMNodeList và tôi phải thực hiện thêm một số tác vụ để in nó thành một chuỗi có thể được sử dụng

Có một số cách để trích xuất các thẻ cụ thể từ tài liệu HTML. Cái mà hầu hết mọi người sẽ nghĩ đến đầu tiên có lẽ là biểu thức chính quy. Tuy nhiên, điều này không phải lúc nào cũng – hoặc, như một số người sẽ khăng khăng, – cách tiếp cận tốt nhất. Các biểu thức chính quy có thể hữu ích cho các vụ hack nhỏ, nhưng sử dụng trình phân tích cú pháp HTML thực thường sẽ dẫn đến mã đơn giản hơn và mạnh mẽ hơn. Các truy vấn phức tạp, chẳng hạn như “tìm tất cả các hàng có lớp. foo của bảng thứ hai của tài liệu này và trả về tất cả các liên kết có trong các hàng đó”, cũng có thể được thực hiện dễ dàng hơn nhiều với một trình phân tích cú pháp phù hợp

Có một số trường hợp cạnh [mặc dù có thể rất ít] trong đó các biểu thức chính quy có thể hoạt động tốt hơn, vì vậy tôi sẽ thảo luận về cả hai cách tiếp cận trong bài đăng này

Trích xuất thẻ bằng DOM

PHP 5 đi kèm với một API DOM có thể sử dụng được tích hợp sẵn mà bạn có thể sử dụng để phân tích và thao tác các tài liệu [X]HTML. Ví dụ: đây là cách bạn có thể sử dụng nó để trích xuất tất cả các URL liên kết từ tệp HTML

//Load the HTML page
$html = file_get_contents['page.htm'];
//Create a new DOM document
$dom = new DOMDocument;

//Parse the HTML. The @ is used to suppress any parsing errors
//that will be thrown if the $html string isn't valid XHTML.
@$dom->loadHTML[$html];

//Get all links. You could also use any other tag name here,
//like 'img' or 'table', to extract other tags.
$links = $dom->getElementsByTagName['a'];

//Iterate over the extracted links and display their URLs
foreach [$links as $link]{
	//Extract and show the "href" attribute. 
	echo $link->getAttribute['href'], '
'; }

Ngoài

Hello!";
    $a = strip_tags[$input];
    $b = strip_tags[$input, ""];
?>
1, bạn cũng có thể sử dụng
Hello!";
    $a = strip_tags[$input];
    $b = strip_tags[$input, ""];
?>
2 để tìm các thẻ có id cụ thể. Đối với các tác vụ phức tạp hơn, chẳng hạn như trích xuất các thẻ được lồng sâu, XPath có lẽ là cách tốt nhất. Ví dụ: để tìm tất cả các mục danh sách có lớp “foo” chứa các liên kết có lớp “bar” và hiển thị các URL liên kết

//Load the HTML page
$html = file_get_contents['page.htm'];
//Parse it. Here we use loadHTML as a static method
//to parse the HTML and create the DOM object in one go.
@$dom = DOMDocument::loadHTML[$html];

//Init the XPath object
$xpath = new DOMXpath[$dom];

//Query the DOM
$links = $xpath->query[ '//li[contains[@class, "foo"]]//a[@class = "bar"]' ];

//Display the results as in the previous example
foreach[$links as $link]{
	echo $link->getAttribute['href'], '
'; }

Để biết thêm thông tin về DOM và XPath, hãy xem các tài nguyên này

  • Tài liệu API DOM
  • Hướng dẫn XPath của W3Schools
  • Đặc tả ngôn ngữ XPath

Danh dự. Trình phân tích cú pháp DOM HTML đơn giản là trình phân tích cú pháp HTML thay thế phổ biến cho PHP 5 cho phép bạn thao tác các trang HTML một cách dễ dàng giống như jQuery. Tuy nhiên, cá nhân tôi không khuyên bạn nên sử dụng nó nếu bạn quan tâm đến hiệu suất của tập lệnh của mình, vì trong các thử nghiệm của tôi DOM HTML đơn giản chậm hơn khoảng 30 lần so với DOMDocument

Trích xuất thẻ & thuộc tính với biểu thức chính quy

Chỉ có hai lợi thế khi xử lý HTML với các biểu thức thông thường - tính khả dụng và hiệu suất trường hợp cạnh. Trong khi hầu hết các trình phân tích cú pháp yêu cầu PHP 5 trở lên, các biểu thức chính quy có sẵn ở hầu hết mọi nơi. Ngoài ra, chúng nhanh hơn một chút so với các trình phân tích cú pháp thực khi bạn cần trích xuất nội dung nào đó từ một tài liệu rất lớn [khoảng 400 KB trở lên]. Tuy nhiên, trong hầu hết các trường hợp, bạn nên sử dụng tiện ích mở rộng PHP DOM hoặc thậm chí DOM HTML đơn giản, không gây rối với các biểu thức chính quy phức tạp

Điều đó nói rằng, đây là một hàm PHP có thể trích xuất bất kỳ thẻ HTML nào và các thuộc tính của chúng từ một chuỗi nhất định

/**
 * extract_tags[]
 * Extract specific HTML tags and their attributes from a string.
 *
 * You can either specify one tag, an array of tag names, or a regular expression that matches the tag name[s]. 
 * If multiple tags are specified you must also set the $selfclosing parameter and it must be the same for 
 * all specified tags [so you can't extract both normal and self-closing tags in one go].
 * 
 * The function returns a numerically indexed array of extracted tags. Each entry is an associative array
 * with these keys :
 * 	tag_name	- the name of the extracted tag, e.g. "a" or "img".
 *	offset		- the numberic offset of the first character of the tag within the HTML source.
 *	contents	- the inner HTML of the tag. This is always empty for self-closing tags.
 *	attributes	- a name -> value array of the tag's attributes, or an empty array if the tag has none.
 *	full_tag	- the entire matched tag, e.g. 'example.com'. This key 
 *		          will only be present if you set $return_the_entire_tag to true.	   
 *
 * @param string $html The HTML code to search for tags.
 * @param string|array $tag The tag[s] to extract.							 
 * @param bool $selfclosing	Whether the tag is self-closing or not. Setting it to null will force the script to try and make an educated guess. 
 * @param bool $return_the_entire_tag Return the entire matched tag in 'full_tag' key of the results array.  
 * @param string $charset The character set of the HTML code. Defaults to ISO-8859-1.
 *
 * @return array An array of extracted tags, or an empty array if no matching tags were found. 
 */
function extract_tags[ $html, $tag, $selfclosing = null, $return_the_entire_tag = false, $charset = 'ISO-8859-1' ]{
	
	if [ is_array[$tag] ]{
		$tag = implode['|', $tag];
	}
	
	//If the user didn't specify if $tag is a self-closing tag we try to auto-detect it
	//by checking against a list of known self-closing tags.
	$selfclosing_tags = array[ 'area', 'base', 'basefont', 'br', 'hr', 'input', 'img', 'link', 'meta', 'col', 'param' ];
	if [ is_null[$selfclosing] ]{
		$selfclosing = in_array[ $tag, $selfclosing_tags ];
	}
	
	//The regexp is different for normal and self-closing tags because I can't figure out 
	//how to make a sufficiently robust unified one.
	if [ $selfclosing ]{
		$tag_pattern = 
			'@					# /> or just >, being lenient here 
			@xsi';
	} else {
		$tag_pattern = 
			'@					# >
			[?P.*?]			# tag contents
							# the closing 
			@xsi';
	}
	
	$attribute_pattern = 
		'@
		[?P\w+]							# attribute name
		\s*=\s*
		[
			[?P[\"\']][?P.*?][?P=quote]	# a quoted value
			|							# or
			[?P[^\s"\']+?][?:\s+|$]			# an unquoted value [terminated by whitespace or EOF] 
		]
		@xsi';

	//Find all tags 
	if [ !preg_match_all[$tag_pattern, $html, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE ] ]{
		//Return an empty array if we didn't find anything
		return array[];
	}
	
	$tags = array[];
	foreach [$matches as $match]{
		
		//Parse tag attributes, if any
		$attributes = array[];
		if [ !empty[$match['attributes'][0]] ]{ 
			
			if [ preg_match_all[ $attribute_pattern, $match['attributes'][0], $attribute_data, PREG_SET_ORDER ] ]{
				//Turn the attribute data into a name->value array
				foreach[$attribute_data as $attr]{
					if[ !empty[$attr['value_quoted']] ]{
						$value = $attr['value_quoted'];
					} else if[ !empty[$attr['value_unquoted']] ]{
						$value = $attr['value_unquoted'];
					} else {
						$value = '';
					}
					
					//Passing the value through html_entity_decode is handy when you want
					//to extract link URLs or something like that. You might want to remove
					//or modify this call if it doesn't fit your situation.
					$value = html_entity_decode[ $value, ENT_QUOTES, $charset ];
					
					$attributes[$attr['name']] = $value;
				}
			}
			
		}
		
		$tag = array[
			'tag_name' => $match['tag'][0],
			'offset' => $match[0][1], 
			'contents' => !empty[$match['contents']]?$match['contents'][0]:'', //empty for self-closing tags
			'attributes' => $attributes, 
		];
		if [ $return_the_entire_tag ]{
			$tag['full_tag'] = $match[0][0]; 			
		}
		 
		$tags[] = $tag;
	}
	
	return $tags;
}

ví dụ sử dụng

Trích xuất tất cả các liên kết và xuất URL của chúng

$html = file_get_contents[ 'example.html' ];
$nodes = extract_tags[ $html, 'a' ];
foreach[$nodes as $link]{
	echo $link['attributes']['href'] , '
'; }

Trích xuất tất cả các thẻ tiêu đề và xuất văn bản của chúng

________số 8

Trích xuất thẻ meta

$nodes = extract_tags[ $html, 'meta' ];

Trích xuất các đoạn văn bản in đậm và in nghiêng

Hello!";
    $a = strip_tags[$input];
    $b = strip_tags[$input, ""];
?>
0

Chức năng này được ghi lại khá tốt, vì vậy hãy kiểm tra nguồn nếu có gì không rõ ràng. Tất nhiên, bạn cũng có thể để lại nhận xét nếu có thêm bất kỳ câu hỏi hoặc phản hồi nào

Làm cách nào để lấy thẻ từ chuỗi HTML trong PHP?

Phương pháp 1. Sử dụng hàm htmlspecialchars[] . Hàm htmlspecialchars[] là một hàm có sẵn trong PHP, được sử dụng để chuyển đổi tất cả các ký tự được xác định trước thành các thực thể HTML. $chuỗi. Tham số này được sử dụng để giữ chuỗi đầu vào. $flags. Tham số này được sử dụng để giữ các cờ.

Làm cách nào để trích xuất HTML từ một chuỗi?

Làm cách nào để trích xuất thẻ HTML từ Chuỗi bằng biểu thức chính quy trong Java? .
Tạo một đối tượng Mẫu bằng cách chuyển biểu thức chính quy đại diện cho thẻ HTML được yêu cầu cho nó làm tham số cho phương thức compile[] của lớp Mẫu
Ghép nó với Chuỗi mong muốn bằng cách sử dụng phương thức đối sánh [] của lớp Mẫu

Làm cách nào để lấy thẻ trong PHP?

Thành phần DOMElement. Hàm getElementsByTagName[] là một hàm có sẵn trong PHP được sử dụng để lấy các phần tử theo tên thẻ. .
cú pháp
Thông số. Hàm này chấp nhận một tham số duy nhất $name chứa tên thẻ hoặc sử dụng * để nhận tất cả các thẻ

Làm cách nào để lấy giá trị của phần tử HTML trong PHP?

Sử dụng siêu toàn cục $_POST hoặc $_GET của PHP để truy xuất giá trị của thẻ đầu vào thông qua tên của thẻ HTML .

Chủ Đề