簡體   English   中英

如何使用PHP和regexp將querystring附加到字符串中的每個URL

[英]How to append querystring to every URL in a string using PHP and regexp

我在LINUX上使用PHP 5.6.40-0 + deb8u5

我想將querystring添加到文本字符串中的每個URL。 我幾乎可以使用了,但最后一個URL卻沒有。 我想念什么?

試圖如何附加到字符串中的所有網址? 但它永遠不會在字符串中最后一個URL。

<?php
    $message = '<h4>Hello there AGAIN . visit  <br />         
    href="http://www.my-domain.com/another-link/" ' ; 
    $message .= ' <br /> or href="http://sub-domain.my-domain.com/subdir/sub-sub-dir/" ';
    $message .= ' <br /> or href="https://www.my-domain.com?uid=hello" ';
    $message .= ' <br /> or href="http://my-domain.com" ';
    $message .= ' <br /> or href="https://my-domain.com" ';
    $message .= ' <br /> or href="http://my-domain.com/" ';
    $message .= ' <br /> or href="https://my-domain.com/" ';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/" ';
    $message .= ' <br /> or href="https://subdomain.my-domain.com" ';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/more-page" ';
    $message .= ' <br /> or "https://subdomain.my-domain.com/"  with no href at the beginning';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/one-more-page/sub-page"  with some more text after it.  ';
    $message .= ' <br /> or href="http://last-one.my-domain.com/one-more-page/sub-page"  with some more text after it. </h4>';

    echo $message;

    function AppendCampaignToString($string) {
        $regex = '/(href="https?:\/\/)(\w*.?my-domain\.com[^"]*)("[^>]*?>/i';
        return preg_replace_callback($regex, '_appendCampaignToString', $string);
    }

    function _AppendCampaignToString($match) {
        $url = $match[2];
        if (strpos($url, '?') === false) {
            $url .= '?';
        }
        else {
            $url .= '&';            
        }
        $url .= "MyID=666888";
        return $match[1].$url  ;
    }

    echo "<hr>" .  AppendCampaignToString($message) . "<hr />" ;
?>

它適用於除最后一個URL以外的所有類型的URL,子域和文件路徑,無論最后一個URL是哪種類型的URL。 所以

回聲“


“ AppendCampaignToString($ message)。
“;

得到:

你好,再次。 訪問
HREF = “http://www.my-domain.com/another-link/?MyID=666888”

或href =“ http://www.my-domain.com/subdir/sub-sub-dir/?MyID=666888”
或href =“ https://www.my-domain.com?uid=hello&MyID=666888”
或href =“ http://my-domain.com?MyID=666888”
或href =“ https://my-domain.com?MyID=666888”
或href =“ http://my-domain.com/?MyID=666888”
或href =“ https://my-domain.com/?MyID=666888”
或href =“ http://subdomain.my-domain.com/?MyID=666888”
或href =“ https://subdomain.my-domain.com?MyID=666888”
或href =“ http://subdomain.my-domain.com/more-page?MyID=666888”
或“ https://subdomain.my-domain.com/ ”,開頭沒有href
或href =“ http://subdomain.my-domain.com/one-more-page/sub-page?MyID=666888”后面帶有更多文本。
或href =“ http://last-one.my-domain.com/one-more-page/sub-page”,其后還有更多文字。

您的最后一個域中包含- ,因此您需要將其放入帶有\\w的字符類中。 這有效:

(href="https?:\/\/)([\w-]*.?my-domain\.com[^"]*)("[^>]*?>)

https://regex101.com/r/etxiQI/2/

另請注意,您問題中的正則表達式缺少結尾( )

此外,如果my-domain是頂級域名,則. 在此之前也應避免。 例如:

(href="https?:\/\/)([\w-]*\.?my-domain\.com[^"]*)("[^>]*?>)

盡管@ user3783243比我快,但是我發布了一個偽工作腳本,因為我花了一些時間調試它:

<?php
    $message = '<h4>Hello there AGAIN . visit  <br />         
    href="http://www.my-domain.com/another-link/" ' ;
    $message .= ' <br /> or href="http://sub-domain.my-domain.com/subdir/sub-sub-dir/" ';
    $message .= ' <br /> or href="https://www.my-domain.com?uid=hello" ';
    $message .= ' <br /> or href="http://my-domain.com" ';
    $message .= ' <br /> or href="https://my-domain.com" ';
    $message .= ' <br /> or href="http://my-domain.com/" ';
    $message .= ' <br /> or href="https://my-domain.com/" ';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/" ';
    $message .= ' <br /> or href="https://subdomain.my-domain.com" ';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/more-page" ';
    $message .= ' <br /> or "https://subdomain.my-domain.com/"  with no href at the beginning';
    $message .= ' <br /> or href="http://subdomain.my-domain.com/one-more-page/sub-page"  with some more text after it.  ';
    $message .= ' <br /> or href="http://last-one.my-domain.com/one-more-page/sub-page"  with some more text after it. </h4>';

    echo $message;

    function AppendCampaignToString($string) {
        $regex = '/(href="https?:\/\/)([a-z0-9-]*.?my-domain\.com[^"]*)"[^>]*?>/i';
        return preg_replace_callback($regex, '_appendCampaignToString', $string, -1);
    }

    function _AppendCampaignToString($match) {
        $url = $match[2];

        echo "MATCHED $url \n";
        if (strpos($url, '?') === false) {
            $url .= '?';
        }
        else {
            $url .= '&';
        }
        $url .= "MyID=666888";
        return $match[1].$url  ;
    }

    echo "<hr>" .  AppendCampaignToString($message) . "<hr />" ;
?>
  • 我從正則表達式中取出了最后一個開放括號(也由@ user3783243提及)
  • 在回調中添加了一條調試消息,以查看實際匹配的內容
  • 擴展了子域匹配以匹配數字,除了\\w-

暫無
暫無

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

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