我有一段代码,可以将单个单词或短语从给定的列表中转换为可点击的内部链接。只有当单词或短语尚未链接时,代码才会执行此操作。实际上,它运行得很好,除了一点:代码考虑的是src图像属性中的名称。
所以,
<img src="img/xiaomi.jpg" />正在输出
<img src="img/<a href="site.com/tag/xiaomi">Xiaomi</a>.jpg" />正如你所看到的,regex可能太贪婪了,得到了不能得到的东西。
为了简单起见,对代码进行了修改,但使用如下:
$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。
发布于 2019-11-18 18:07:37
您可以用<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,单词边界,除>和>以外的任何0+字符。(*SKIP)(*FAIL) - PCRE谓词,然后从发生故障的索引开始下一次匹配搜索。| -或\b...\b -整个单词$var (只有当它只包含单词字符时才有效,否则您需要使用preg_quote($var, "~")并使用其他边界)。见regex演示。
https://stackoverflow.com/questions/58918438
复制相似问题