【问题标题】:append var to url with PHP preg_replace使用 PHP preg_replace 将 var 附加到 url
【发布时间】:2018-10-16 14:43:47
【问题描述】:

好的,所以我有一个字符串(它是电子邮件的内容),我需要将一个变量附加到该字符串上存在的任何 URL。 我们可以认为所有 URL 都在锚标签的 href 属性内 因此,我想搜索任何出现的 href="whatever" 并将其替换为 href="whatever?myvar"。 理想情况下,我还想检查链接中是否已经包含任何 var,以便将其附加为“&myvar”而不是“?myvar”。

我有类似的东西,但我迷失了正则表达式..

$pattern = '"\b(http?://\S+)"';
$html_links = preg_replace($pattern, '$1&myvar', $text);

这不起作用,因为它在 href 属性的右双引号之后附加了我的 var...

抱歉,我对正则表达式很不满意。任何帮助将不胜感激!

【问题讨论】:

标签: php regex preg-replace


【解决方案1】:

你可以试试这个,它适用于我给它的测试数据。

<?
$text = '<a href="http://whatever">whatever</a> <a href=\'http://whatever?somevar=1\'>something</a>';
$pattern1 = '/([\'"])(https?:\/\/[^\1?]+)\1/';
$pattern2 = '/([\'"])(https?:\/\/[^\1]+\?[^\1]+)\1/';
$html_links = preg_replace($pattern2, '$1$2&amp;myvar$1', $text);
$html_links = preg_replace($pattern1, '$1$2?myvar$1', $html_links);

var_dump($html_links);

解释:

$pattern1 = '/([\'"])(https?:\/\/[^\1?]+)\1/';

([\'"])引号

(https?:\/\/[^\1?]+) http 后跟可选的 s 后跟 as 尽可能直到匹配的引号

\1 结束引用反向引用

$pattern2 = '/([\'"])(https?:\/\/[^\1]+\?[^\1]+)\1/';

(https?:\/\/[^\1]+\?[^\1]+) 同上,但需要?

【讨论】:

    【解决方案2】:

    通常使用正则表达式解析任何类型的 HTML (here is why) 是一个坏主意。最好使用Dom parser 中的 PHP 构建。你可以这样做:

    //SET YOUR variable
    $myvar='MYVAR=I WANT BEER';
    //GET THE DOM
    $dom = new DOMDocument('1.0','UTF-8');
    $iEr = libxml_use_internal_errors(true);
    $dom->loadHTML($text);
    libxml_use_internal_errors($iEr);
    
    //LOOK FOR <A HREFS=
    foreach ($dom->getElementsByTagName('a') as $node) {
        if($node->hasAttribute('href')){
            $href=$node->getAttribute('href');
    
            //look for query parts
            $query = parse_url($href, PHP_URL_QUERY);
    
            //if no query part, add ?
            if($query===NULL) $new_link = $href.'?';
            // if there is a query part, add &
            else $new_link = $href.'&';
    
            //add your own variable
            $new_link.=$myvar;
    
            //replace the old link with the new one
            $node->setAttribute('href',$new_link);
        }
    }
    //SAVE THE NEW DOM 
    $new_text=$dom->saveHtml();
    

    至于为什么使用libxml_use_internal_errorstake a look here

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2023-03-09
      • 2015-12-23
      • 2013-12-18
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多