2011-02-02 39 views
8

Tôi có một chuỗi trông giống như:PHP: loại bỏ `http: //` từ tiêu đề liên kết

$string = '<a href="http://google.com">http://google.com</a>';

Làm thế nào tôi có thể loại bỏ các http:// phần từ các văn bản liên kết, nhưng để nó trong href thuộc tính?

+0

Bạn có thể tìm thấy [ 's ($ str) -> replaceLast ('http: //') '] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L305) hữu ích, như được tìm thấy trong [độc lập này thư viện] (https://github.com/delight-im/PHP-Str). – caw

Trả lời

11

Nếu không sử dụng một phân tích cú pháp toàn diện, điều này có thể làm các trick cho hầu hết các tình huống ...

$str = '<a href="http://google.com">http://google.com</a>'; 

$regex = '/(?<!href=["\'])http:\/\//'; 

$str = preg_replace($regex, '', $str); 

var_dump($str); // string(42) "<a href="http://google.com">google.com</a>" 

Nó sử dụng một lookbehind tiêu cực để đảm bảo không có href=" hoặc href=' trước nó.

See it on IDEone.

Nó cũng tính đến những người phân định giá trị thuộc tính của họ với '.

+0

hoạt động, tx. trang web đẹp ideone này, bạn thực sự có thể chạy mã php trên nó :) – Alex

+0

@Alexandra Không phải lo lắng, đó là một câu hỏi hay! – alex

9
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = str_replace('>http://','>',$string); 

Chỉ cần thử điều này trong IDEone.com và nó có hiệu quả mong muốn.

+1

@ardman ... PHP ?? !!! Địa ngục phải bị đóng băng! –

+2

Chỉ đáng để ném ra khỏi đó, điều này sẽ không bắt được '> http: // ...', nhưng nếu bạn cắt bỏ các khoảng trống trước thì điều này sẽ làm điều đó. – Robert

+0

Tôi không biết tại sao nhưng nó không hoạt động, tôi nhận được một chuỗi rỗng .. – Alex

1
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = explode('http://',$string); 
echo $var[2]; 
2

Bất kỳ biểu thức thông thường hoặc chuỗi thay thế chuỗi nào có thể sẽ thất bại trong trường hợp chung. Cách "chính xác" duy nhất để làm điều đó là phân tích cú pháp đoạn mã SGML/XML và xóa http:// khỏi giá trị.

Đối với bất kỳ mã thao tác chuỗi nào khác (hợp lý ngắn), việc tìm kiếm một ví dụ vi phạm sẽ rất dễ dàng.

+0

Vâng, cách không chính xác vẫn còn phù hợp hơn. Không đủ khả năng cạnh trường hợp để đảm bảo sử dụng giải pháp quá mức (trình phân tích cú pháp html) tại đây. Một biểu thức chính quy là đủ. (Không có regex cho meme phân tích html là hơi ngày.) – mario

+1

"meme" của một người đàn ông là sự chính xác của một người đàn ông khác.Chúng tôi không biết làm thế nào quan trọng là để làm việc này tất cả các thời gian, hoặc làm thế nào đáng tin cậy đầu vào có thể được. Regex có lẽ sẽ làm việc, nhưng tôi không muốn cho @Alexandra ấn tượng rằng vấn đề của họ được giải quyết cho mọi đầu vào có thể. –

2

Giả sử rằng "http: //" luôn xuất hiện hai lần trên chuỗi $, tìm chuỗi cho "http: //" ngược sử dụng strripos. Nếu tìm kiếm thành công, bạn sẽ biết start_index của "http: //" bạn muốn xóa (và bạn biết độ dài của khóa học). Bây giờ bạn có thể sử dụng chất nền để trích xuất tất cả mọi thứ mà đi trước và sau khi đoạn bạn muốn loại bỏ.

4

Trong trường hợp đơn giản này, hàm preg_replace có thể hoạt động. Đối với sự ổn định hơn, hãy thử sử dụng DOMDocument:

$string = '<a href="http://google.com">http://google.com</a>'; 
$dom = new DOMDocument; 
$dom->loadXML($string); 

$link = $dom->firstChild; 
$link->nodeValue = str_replace('http://', '', $link->nodeValue); 
$string = $dom->saveXML($link); 
+0

Chỉ cần một trường hợp cạnh, bạn có thể muốn sử dụng regex để đảm bảo bạn tách nó ra khỏi đầu, những gì về một liên kết như 'http://example.com/send-to-friend?url=http:// somewhere.com'? Ngoài ra, +1 để sử dụng trình phân tích cú pháp. – alex

3
$str = 'http://www.google.com'; 
$str = preg_replace('#^https?://#', '', $str); 
echo $str; // www.google.com 

rằng sẽ làm việc cho cả http: // và https: //

running live code

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