php - 如何将字符串中的每个 URL 替换为另一个唯一的 URL?

标签 php regex preg-replace replace

我有以下内容:

$reg[0] = '`<a(\s[^>]*)href="([^"]*)"([^>]*)>`si';
$reg[1] = '`<a(\s[^>]*)href="([^"]*)"([^>]*)>`si';
$replace[0] = '<a$1href="http://www.yahoo.com"$3>';
$replace[1] = '<a$1href="http://www.live.com"$3>';
$string = 'Test <a href="http://www.google.com">Google!!</a>Test <a href="http://www.google.com">Google!!2</a>Test';
echo preg_replace($reg, $replace, $string);

结果是:

Test <a href="http://www.live.com">Google!!</a>Test <a href="http://www.live.com">Google!!2</a>Test

我希望最终得到(区别在于第一个链接):

Test <a href="http://www.yahoo.com">Google!!</a>Test <a href="http://www.live.com">Google!!2</a>Test

这个想法是将字符串中链接中的每个 URL 替换为唯一的其他 URL。这是一个时事通讯系统,我想跟踪人们点击的内容,因此 URL 将是一个“假”URL,在记录点击后,他们将被重定向到真实的 URL。

最佳答案

问题是您的第一个替换字符串将与第二个搜索模式匹配,从而有效地用第二个替换字符串覆盖第一个替换字符串。

除非你能以某种方式区分“修改后的”链接和原始链接,这样它们就不会被其他表达式捕获(也许通过添加额外的 HTML 属性?),我认为你不能真正解决这个问题一次 preg_replace() 调用。我想到的一种可能的解决方案(除了正则表达式中的差异)是使用 preg_match_all() ,因为它将为您提供一系列可供使用的匹配项。然后,您可以通过迭代数组并在每个匹配的 URL 上运行 str_replace() 来使用跟踪 URL 对匹配的 URL 进行编码。

关于php - 如何将字符串中的每个 URL 替换为另一个唯一的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763064/

相关文章:

regex - 使用 .htaccess 文件删除 .php 文件扩展名

php - PHP函数检索YouTube ID +删除某些参数

PHP - 需要删除字符串中的重复字符但希望包含异常

php - 调用fedex服务时出现Nodejs Soap模块问题

php - 如何使用 php 中的数据库记录正确循环和创建 json

javascript - 使用正则表达式匹配整个字符串

php - 是否有与 PHP 的 preg_replace 等效的 MySQL?

php - 如何在cakephp中使用where子句对连接的多对多表进行分页?

php - 为什么 PHP is_link 函数返回 FALSE?

python - pandas:检查引用列表中的匹配值的系列,为每个匹配生成新记录