2009-09-01 38 views
17

Mặc dù sử dụng PHP trong nhiều năm, tôi chưa bao giờ thực sự học cách sử dụng các biểu thức để cắt xén các chuỗi đúng cách ... hiện đang cắn tôi ở mặt sau!Làm thế nào để loại bỏ văn bản giữa các thẻ trong php?

Có ai có thể cung cấp cho tôi một số trợ giúp cắt xén này không? Tôi cần phải chặt ra phần văn bản từ url, biến

<a href="link.html">text</a> 

vào

<a href="link.html"></a> 

Trả lời

29
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str) 
+0

Trong khi tác phẩm này hoạt động, bạn thường không muốn phân tích cú pháp HTML bằng các regex. Câu trả lời của Karim có thể thích hợp hơn. – Konerak

6

gì về một cái gì đó như thế này, xem xét bạn có thể muốn tái sử dụng nó với href s khác:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

nào sẽ giúp bạn:

string '<a href="link.html"></a>' (length=24) 

(Tôi đang xem xét bạn đã thực hiện lỗi đánh máy trong OP?)


Nếu bạn không cần phải phù hợp bất kỳ href khác, bạn có thể sử dụng một cái gì đó như:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a href="link.html">).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

nào cũng sẽ giúp bạn:

string '<a href="link.html"></a>' (length=24) 


Là một sidenote: đối với HTML phức tạp hơn, không cố gắng sử dụng cụm từ thông dụng: chúng hoạt động tốt cho loại tình huống đơn giản này, nhưng đối với phần HTML thực tế, chúng không thực sự hữu ích, trong chi l: HTML không hoàn toàn "thường xuyên" "đủ" để được phân tích cú pháp bằng các regex.

1

Bạn có thể sử dụng chuỗi con kết hợp với stringpos, dù đây không phải là cách tiếp cận rất hay.

Kiểm tra: PHP Manual - String functions

Một cách khác sẽ được để viết một biểu thức chính quy để phù hợp với tiêu chí của bạn. Nhưng để giải quyết vấn đề của bạn nhanh chóng, các chức năng chuỗi sẽ làm ...

EDIT: Tôi đã đánh giá thấp đối tượng. ;) Đi trước với regexes ... ^^

14

Sử dụng SimpleHTMLDom:

<?php 
// example of how to modify anchor innerText 
include('simple_html_dom.php'); 

// get DOM from URL or file 
$html = file_get_html('http://www.example.com/'); 

//set innerText to null for each anchor 
foreach($html->find('a') as $e) { 
    $e->innerText = null; 
} 

// dump contents 
echo $html; 
?> 
+2

Không phạm tội, nhưng câu trả lời này là 8 tuổi, và không ai thực sự nhận thấy rằng câu trả lời này là không chính xác và không hoạt động. Vòng lặp foreach không có tác dụng khi chỉ đơn giản là lặp lại '$ html'. Không thể tin rằng điều này có rất nhiều phiếu bầu và không ai thực sự thử nghiệm nó. –

1

Chỉ sử dụng strip_tags(), điều đó sẽ thoát khỏi các thẻ và trái chỉ văn bản mong muốn giữa chúng

0

Bạn không cần phải tự chụp các thẻ. Chỉ cần nhắm mục tiêu văn bản giữa các thẻ và thay thế nó bằng một chuỗi rỗng. Siêu đơn giản.

Code: (Demo)

$string='<a href="link.html">text</a>'; 
echo preg_replace('/<a[^>]*>\K[^<]*/','',$string); 
// the opening tag--^^^^^^^^ ^^^^^-match everything before the end tag 
//       ^^-restart fullstring match 

Output:

<a href="link.html"></a> 

Hoặc trong trường hợp rìa khi văn bản liên kết có chứa một <, sử dụng này: ~<a[^>]*>\K.*?(?=</a>)~

Điều này tránh các chi phí của nắm bắt các nhóm bằng cách sử dụng một định lượng lười biếng, chuỗi đầy đủ khởi động lại \K và một "lookahead".

Các vấn đề liên quan