在字符串中搜索 URLS 并将查询字符串添加到每个问题

Searching for URLS in string and add query string to each one problem

我编写了这个脚本来执行此操作,但有一个问题我无法弄清楚:

$buffer = '<a href="http://wwww.domain.com">Domain1</a>';
$buffer .= '<a href="http://wwww.domain.com?id=2">Domain2</a>';

preg_match_all('/<a href="(.*?)"/s', $buffer, $matches);

$searches = array();
$replaces = array();

foreach($matches[1] as $link){

    $contain = parse_url($link, PHP_URL_QUERY);

    $symbol = $contain ? "&" : "?";

    $new_link = $link . $symbol . "mode=testing";

    $searches[] = $link;

    $replaces[] = $new_link;

}
$newbuffer = str_replace($searches ,$replaces , $buffer);

var_dump($newbuffer);

输出:

<a href="http://wwww.domain.com?mode=testing">Domain1</a>
<a href="http://wwww.domain.com?mode=testing?id=2">Domain2</a>

预期输出将参数添加到每个 link:

<a href="http://wwww.domain.com?mode=testing">Domain1</a>
<a href="http://wwww.domain.com?id=2&mode=testing">Domain2</a>

有什么帮助吗?

问题来自:

  • $searches 包含:
array(2) {
  [0]=>
  string(24) ""http://wwww.domain.com""
  [1]=>
  string(29) ""http://wwww.domain.com?id=2""
}
  • $replaces 包含:
array(2) {
  [0]=>
  string(37) ""http://wwww.domain.com?mode=testing""
  [1]=>
  string(42) ""http://wwww.domain.com?id=2&mode=testing""
}

然后str_replace$searches中的所有个元素替换为$replaces中的所有个元素,因此,http://wwww.domain.comhttp://wwww.domain.com?mode=testing AND http://wwww.domain.com?id=2http://wwww.domain.com?mode=testing?id=2 (它在 domain.com 之后附加 ?mode=testing

这是一个解决方案:

在两个数组中的链接周围添加 "

$buffer = '<a href="http://wwww.domain.com">Domain1</a>';
$buffer .= '<a href="http://wwww.domain.com?id=2">Domain2</a>';

preg_match_all('/<a href="(.*?)"/s', $buffer, $matches);

$searches = array();
$replaces = array();

foreach($matches[1] as $link){
    $contain = parse_url($link, PHP_URL_QUERY);
    $symbol = $contain ? "&" : "?";
    $new_link = $link . $symbol . "mode=testing";
    $searches[] = '"' . $link . '"';
    $replaces[] = '"' . $new_link . '"';
}
$newbuffer = str_replace($searches ,$replaces , $buffer);
var_dump($newbuffer);

输出:

<a href="http://wwww.domain.com?mode=testing">Domain1</a>
<a href="http://wwww.domain.com?id=2&mode=testing">Domain2</a>