1

我有一段代码可以将单个单词或短语从给定列表中转换为可点击的内部链接。仅当单词或短语尚未链接时,代码才应该执行此操作。它实际上工作得很好,除了一点:代码正在考虑来自 src 图像属性的名称。

所以,

<img src="img/xiaomi.jpg" />

正在输出

<img src="img/<a href="site.com/tag/xiaomi">Xiaomi</a>.jpg" />

正如您所看到的,正则表达式可能过于贪婪并且得到了没有得到的东西。

代码被修改为简单,但使用如下:

$content     = 'All post content itself with all html tags a site can have. <p>Blabla</p> <img src="img/xiaomi.jpg" /> <p>Bliblibli</p> <p>Lorem ipsum xiaomi</p>';
$contentCopy = 'All post content itself with all html tags a site can have. <p>Blabla</p> <img src="img/xiaomi.jpg" /> <p>Bliblibli</p> <p>Lorem ipsum xiaomi</p>';

$list = $this->cache->get('wordsList');

foreach($list as $word){
    $var = $word->word;
    $text = preg_replace('/<a[\S\s]+?<\/a>(*SKIP)(*FAIL)|\b'.$var.'\b/i', '<a href="'.base_url('site/tag/'.url_title($var)).'" target="_blank" title="'.ucfirst($var).'">$0</a>', $text);
}
$content = str_replace($contentCopy,$text,$content);

你们能帮忙改进这段代码吗?

显然问题仅存在于图像标签中。

我使用此代码段自动为存储的页面创建内部链接并帮助网站 SEO

4

1 回答 1

0

您可以替换<a[\S\s]+?<\/a>(?:<a[\S\s]+?<\/a>|<img\b[^>]*>). 这是使用 a.s修饰符而不是 的变体[\s\S]

'~(?:<a.*?</a>|<img\b[^>]*>)(*SKIP)(*FAIL)|\b'.$var.'\b~si'

快速详细信息:

  • (?:<a.*?</a>|<img\b[^>]*>)- <a, 尽可能少的任何 0+ 字符, </a>, 或<img, 字边界, 除>and以外的任何 0+ 字符>
  • (*SKIP)(*FAIL)- 使当前匹配在当前索引处失败并从发生失败的索引处开始下一个匹配搜索的 PCRE 动词
  • |- 或者
  • \b...\b- 整个单词$var(仅当它仅包含单词字符时才有效,否则您需要preg_quote($var, "~")并使用其他边界)。

请参阅正则表达式演示

于 2019-11-18T18:07:37.210 回答