如何用 preg_replace 替换单词而不重复?

2023-12-15

我想创建一个 PHP 函数,它将用内部链接替换文本中的某些单词。到目前为止,这有效,但如果我有两个匹配项,我最终会得到无效的 HTML 代码。

Example:



Welpen               /hunde  
Chihuahua Welpen     /hunde,chihuahua
  
function seo_internal_links($str, $links, $limit) {
    foreach($links AS $link){
        $pattern[$k] = "~\b($link[phrase])\b~i";
        $replace[$k] = '<a href="'.$link[link].'">\\1</a>';
        $k++;
    }
    return preg_replace($pattern,$replace,$str, $limit);
}

seo_internal_links($ad[text], $seo_internal_links, $limit = 1);

这将导致:

<a href="//hunde,chihuahua">Chihuahua <a href="/hunde">Welpen</a></a>

有人知道如何避免这种情况吗?我还想限制点击量,但 preg_replace 中的限制仅考虑唯一单词,而不是整个数组。


一些额外的解释。

我正在从表格中取出要替换的单词及其相应的替换项。有数百个。

    $stmt ="
    SELECT *
    FROM $T73
    ORDER BY prio desc
";
$result = execute_stmt($stmt, $link);
while ($row = mysql_fetch_object($result)){     
    $seo_internal_links[$row->ID]['phrase'] = $row->phrase;
    $seo_internal_links[$row->ID]['link'] = $row->link;
}

$my[text] = seo_internal_links($my[text], $seo_internal_links, $limit = 1);

出现问题的原因是替换函数将再次从文本开头开始搜索下一个单词。相反,它应该在文本中继续。

我的目标是每当在充满关键字的表格中找到相关单词时,就插入指向我的网站文本的内部链接。例如,将“beagle welpen”替换为“比格犬韦尔彭。如果单词“welpen”也在表格内,它将破坏html代码并再次插入href标签。


不要使用循环,而是构建单个正则表达式并一次性修改整个文档。也就是说,代替这些正则表达式:

~\b(foo)\b~i
~\b(bar)\b~i
~\b(baz)\b~i

只使用这个:

~\b(foo|bar|baz)\b~i

您可能想看看使用implode构造正则表达式。

您还需要注意正则表达式中具有特殊含义的字符。你可能会发现preg_quote对此有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 preg_replace 替换单词而不重复? 的相关文章

  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • 如何在 Laravel 5.5 中编辑“页面因不活动而已过期”的视图

    在 Laravel 5 5 中 当您使用 CSRF 保护 默认情况下 并且在长时间不活动后发送发布请求时 您将收到此错误页面 屏幕截图 我对此错误表示同意 但是 我需要更改此错误的视图 文本以确保与我的应用程序风格和语言相匹配 关于如何编辑
  • 如何从 Laravel 5 中的 Public/Images 文件夹中删除图像(URL 数据)

    如何从 laravel 5 中的 public images 文件夹中删除图像文件 我从这个网站找到了一些例子 但我知道他们只是在他们的文件中使用文件名record table 但我正在使用类似的东西URL e g localhost pr
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • 从子字符串中提取的映射运算符

    I have list of dicts print L 0 x 1 1 y 2 2 z 1 0 x 1 1 y lt 3 2 z gt 1 我想创建元组 其值位于运算符之前 运算符之后 值之后 first step wanted x 1
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • WooCommerce:用文本覆盖购物车价格

    我们有很多产品具有以下功能 No price 零价格 我们让它们可以通过内置挂钩购买 但购物车仍然将它们显示为具有0 price结账时 我们希望购物车和结帐摘要显示 特殊订单 或任何其他文本 但 WooCommerce 似乎使基于文本的价格
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • 需要 mysqli_fetch_all 的替代方案

    我有一个 php mysqli 代码 可以找到一个我的本地服务器 但是在我的服务器上使用它时 我得到了一个 Fatal error Call to undefined function mysqli fetch all in home3 t
  • ( 后的正则表达式匹配数

    我正在尝试使用正则表达式来匹配开括号 字符后的可变长度的数字 我努力了 d 但该正则表达式在匹配中包含括号 我该如何排除它 我正在使用 Sublime Text 正则表达式引擎来进行匹配 您可以使用积极的后视 http www regula
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • 如何创建环境变量来保护我的网站的 Google 地图 API 密钥(或任何其他秘密值)?

    我正在学习使用 Bootstrap 编写自己的网站 并使用 Google 地图 API 密钥和 Google Developers 的脚本轻松地将地图放置在我的页面上 理想情况下 我会有类似的东西 即我已经尝试过这个 Html PHP
  • 避免 SQLite3 中的 SQL 注入

    我正在尝试找出一种避免 SQL 注入的好简单方法 到目前为止我只能提出两个想法 对用户输入进行 Base64 编码 其实不想这样做 使用正则表达式删除不需要的字符 目前正在使用这个 不确定是否100 安全 这是我当前的代码
  • 无需下载整个文件即可读取 ID3 标签

    是否可以读取 MP3 文件的 ID3 标签 持续时间 艺术家 标题 而无需下载整个文件 我做了一些测试 只需下载 MP3 文件的几个字节就可以获得艺术家和标题标签 但我不确定持续时间和其他标签是否可能 Thanks 我刚刚发现 ffmpeg
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID
  • 从外部 bash 设置环境变量

    我试图使用 PHP 从命令行 设置 bash 环境变量 但没有成功 buff array buff VARTESTKEY VARTESTVALUE buff export VARTESTKEY file put contents scrip
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • 使正则表达式以惰性方式匹配,同时跳过一些单词

    我想要正则表达式 其中包括跳过一些单词以惰性方式匹配 例如 正则表达式 all s S 0 10 s Damages amount s S 0 10 s in s excess s of 示例文本 第 8 1 a 条规定的所有此类损害超出免
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que

随机推荐