我有一段代码可以将单个单词或短语变成给定列表中可点击的内部链接。 仅当单词或短语尚未链接时,代码才应该执行此操作。 除了一点以外,它实际上非常有效: 代码正在考虑src images属性的名称。
所以
<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上提供帮助
答案 0 :(得分:0)
您可以将<a[\S\s]+?<\/a>
替换为(?:<a[\S\s]+?<\/a>|<img\b[^>]*>)
。这是一个带有.
和s
修饰符而不是[\s\S]
的变体:
'~(?:<a.*?</a>|<img\b[^>]*>)(*SKIP)(*FAIL)|\b'.$var.'\b~si'
详细信息:
(?:<a.*?</a>|<img\b[^>]*>)
-<a
,尽可能少的0+个字符,</a>
或<img
,单词边界,{{1}以外的任何0+字符},然后>
>
-使当前匹配项失效的PCRE动词在当前索引处失败,并从发生故障的该索引处开始下一个匹配项搜索(*SKIP)(*FAIL)
-或|
-整个单词\b...\b
(仅在仅包含字符char的情况下有效,否则您需要$var
并使用其他边界)。请参见regex demo。