簡體   English   中英

PHP中的正則表達式/查找“ <a> </a> ”

[英]Regular expressions in PHP / find “<a> </a>”

我想檢查一個文本區域。 如果用戶在textarea中輸入一些鏈接,則php應該自動標記這些鏈接。 我正在使用此代碼:

    $message = "text with some link within"; 

    $url = '@(?!<a[^>]*?>)(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])(?![^<]*?</a>)@';


    if(preg_match($url, $message) == 1){

    $message = preg_replace($url, '<a href="http$2://$4" target="_blank" rel="nofollow" title="$0">$0</a>', $message);

    }

問題是,當已經有一個標記的鏈接(帶有“ a”標簽)時,正則表達式會破壞該鏈接。

這是一個例子:

來自textarea的第一個輸入:Hello .... test.com

由正則表達式更改: Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>

這工作正常,但是如果您更新此內容:

Hello ... http://test.com" target="_blank" rel="nofollow" title="test.com" target="_blank" rel="nofollow" title="test.com">test.com">test.com">test.com

謝謝你的幫助!

我不熟悉PHP,也許這不是用於URL驗證的好模式,但是要點是,如果已經有一個“ a”標記,則不會替換文本。

<?php

    $message = array(
        'Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>',
        "Hello .... http://www.test.com ..."
    );

    $url = '@(<a[^>]*>[^<]+</a>|((https?://)?[\w\.-]+\.[a-zA-Z]{2,3}[^\s\W]*))@';

    foreach ($message as $msg) {

        preg_match($url, $msg, $matches);

        if(preg_match($url, $msg) == 1 && count($matches) > 2) {

            $msg = preg_replace($url, '<a href="$0" target="_blank" rel="nofollow" title="$0">$0</a>', $msg);

        }

        echo $msg.PHP_EOL;

    }

    // Output:
    // Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>
    // Hello .... <a href="http://www.test.com" target="_blank" rel="nofollow" title="http://www.test.com">http://www.test.com</a> ...

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM