繁体   English   中英

用PHP preg_replace将var附加到url

[英]append var to url with PHP preg_replace

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

我有这样的东西,但我迷上了正则表达式。

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

这是行不通的,因为它是在href属性的结尾双引号后面附加我的变量...

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

您可以尝试一下,该方法适用于我提供的测试数据。

<?
$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,然后尽可能多的选择直到匹配的引号

\\1结束引用反向引用

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

(https?:\\/\\/[^\\1]+\\?[^\\1]+)如上所述,但需要一个?

通常,使用regex解析任何类型的HTML是一个坏主意(这就是原因) 最好使用Dom解析器中的 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_errors请看这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM