【问题标题】:PHP preg_match multiple occurence & multipe uses on same pagePHP preg_match 在同一页面上多次出现和多个用户
【发布时间】:2017-05-31 19:38:56
【问题描述】:

我创建了一个 CSV 文件,其中包含两列,其中一列包含由 | 分隔的关键字列表。另一个有 URL。

我试图用这个文件做的是在我的博客文章中找到关键字,并用指向 CSV 文件中 URL 的链接替换纯文本。最终目标是提高某些关键字的 SEO 性能。

我正在使用以下代码:

foreach ($links as $key=>$value)
        {
            $url=$value["url"];
            $pattern="#<p.*?>(.*)\ (".$value["keyword"].")\ (.*)</p>#";
            $content=preg_replace($pattern,"$1 <a href=\"".$url."\">$2</a> $3",$content);
        }

$links 是一个包含 CSV 文件内容的数组,它有一个包含关键字的键和一个包含 URL 的键。

例子

$value["keyword"] contains keyword1|keyword2
$value["url"] contains the url to point to
$content contains the article

上面提到的代码可以正常工作,但并不是我希望的那样工作。对于一个给定的关键字,它不会替换该关键字的所有出现。有些关键字根本没有被替换。正则表达式肯定有问题,但我没有直接看到哪里。

最后,我想要:

  • 用链接替换关键字
  • 限制关键字被替换的次数,以避免文章中出现链接(例如:替换前两次出现的两个)
  • 在页面加载时应用 preg_replace,因为我会定期更改关键字列表以找到最有效的关键字组合

    • 避免影响页面加载性能
    • 我正在使用 Wordpress,不想使用外部插件

简而言之,我的问题是:

  • 如何转换正则表达式,以便所有关键字最多被替换 X 次
  • 如何确保此 preg_match 不会降低我的页面性能

有什么想法吗?

非常感谢!

劳伦特

【问题讨论】:

  • 您的正则表达式没有按照您的想法工作。你为什么在p 标签内寻找?你的意思是在它之外还有你不想匹配的相同单词?
  • 确实,这些词有时会出现在标题或其他链接中,所以我想确保我只替换纯文本中的词。

标签: php regex preg-replace


【解决方案1】:

如何转换正则表达式,以便所有关键字最多被替换 X 次

在 preg_replace 中有一个limit 参数:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

所以在你的代码中:

$content=preg_replace($pattern,"$1 <a href=\"".$url."\">$2</a> $3",$content, $MAX_REPLACE);

如何确保此 preg_match 不会降低我的页面性能

除非您的网页中有数百个关键字,否则性能不会受到影响。 但是您最好重新编写源文件,而不是在每次请求时都进行替换。

【讨论】:

  • 谢谢,我不知道 limit 参数,这应该可以解决其中一个问题,但您知道如何确保所有关键字都被替换吗?不知何故,由于某种原因,一些关键字被完全丢弃。
  • 对于性能,列表只会随着时间的推移而增长,所以我最终可能会得到一个包含 100 多个关键字的列表。页面中要替换的关键字数量应保持在可控范围内,尤其是使用 limit 参数。列表的大小会影响性能吗?还是只执行 preg_replace?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
相关资源
最近更新 更多