用PHP preg_replace将var附加到url

时间:2018-10-16 14:43:47

标签: php regex preg-replace

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

我有类似的东西,但是我对正则表达式感到迷惑。

$compileProvider

这不起作用,因为它是在将href属性后的双引号后附加我的变量...

对不起,我对正则表达式感到很遗憾。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

<?
$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]+)如上所述,但需要一个?

答案 1 :(得分:0)

通常,使用正则表达式解析任何类型的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