首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Preg_replace -正则表达式- PHP "autolink“

Preg_replace -正则表达式- PHP "autolink“
EN

Stack Overflow用户
提问于 2019-11-18 15:53:56
回答 1查看 83关注 0票数 1

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

所以,

代码语言:javascript
复制
<img src="img/xiaomi.jpg" />

正在输出

代码语言:javascript
复制
<img src="img/<a href="site.com/tag/xiaomi">Xiaomi</a>.jpg" />

正如你所看到的,regex可能太贪婪了,得到了不能得到的东西。

为了简单起见,对代码进行了修改,但使用如下:

代码语言:javascript
复制
$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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-18 18:07:37

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

代码语言:javascript
复制
'~(?:<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演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58918438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档