Preg_replace - 正则表达式 - PHP "autolink"
Preg_replace - regular expression - PHP "autolink"
我有一段代码可以将给定列表中的单个单词或短语转换为可点击的内部链接。
只有当单词或短语尚未链接时,代码才应该执行此操作。
除了一点外,它实际上工作得非常好:
代码正在考虑来自 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).'">[=15=]</a>', $text);
}
$content = str_replace($contentCopy,$text,$content);
你们能帮忙改进一下这段代码吗?
显然问题只出在图像标签中。
我使用此代码段为存储的页面自动创建内部链接并帮助网站 SEO
您可以将 <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+ 个字符20=] 然后 >
(*SKIP)(*FAIL)
- 使当前匹配在当前索引处失败并从发生失败的索引开始下一个匹配搜索的 PCRE 动词
|
- 或
\b...\b
- 整个单词 $var
(仅当它仅包含单词字符时才有效,否则您需要 preg_quote($var, "~")
并使用其他边界)。
参见regex demo。
我有一段代码可以将给定列表中的单个单词或短语转换为可点击的内部链接。 只有当单词或短语尚未链接时,代码才应该执行此操作。 除了一点外,它实际上工作得非常好: 代码正在考虑来自 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).'">[=15=]</a>', $text);
}
$content = str_replace($contentCopy,$text,$content);
你们能帮忙改进一下这段代码吗?
显然问题只出在图像标签中。
我使用此代码段为存储的页面自动创建内部链接并帮助网站 SEO
您可以将 <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+ 个字符20=] 然后>
(*SKIP)(*FAIL)
- 使当前匹配在当前索引处失败并从发生失败的索引开始下一个匹配搜索的 PCRE 动词|
- 或\b...\b
- 整个单词$var
(仅当它仅包含单词字符时才有效,否则您需要preg_quote($var, "~")
并使用其他边界)。
参见regex demo。