substr_replace替换问题
写了一个小程序,想把网站文章中出现的关键词自动加链接,并且当关键词出现多次时只替换一次,与是用到了strpos()及substr_replace实现了此功能,代码如下:
function keywords_autolink($content) { $keywords=array( '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>', '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>', '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>', '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>', '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>' ); $keys=array_keys($keywords); foreach ($keys as $k) { $pos=strpos($content, $k); if ($pos !== false) { // Nothing found $length=strlen($k); $content=substr_replace($content, $keywords[$k], $pos, $length); //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。 unset($k);//最后销毁一下哦。 } } return $content; }add_filter('the_content', 'keywords_autolink');
但现在的一个问题是,当同时出现两个需要替换的词时就会乱套,比如,企业管理书籍和企业管理同时出现了,即“企业管理书籍企业管理'”,那么这时候替换结果就成了:
<a href="http://www.12reads.cn/" title="<a target='_blank' title='企业管理' href='http://www.12reads.cn/'>企业管理</a>书籍" target="_blank">企业管理书籍</a>
请问这种问题如何解决呀?大概知道用排序法什么的,可是不太懂,还望前辈们指点下,谢谢了!
回复讨论(解决方案)
function keywords_autolink($content) { $keywords=array( '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>', '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>', '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>', '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>', '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>' ); /* $keys=array_keys($keywords); foreach ($keys as $k) { $pos=strpos($content, $k); if ($pos !== false) { // Nothing found $length=strlen($k); $content=substr_replace($content, $keywords[$k], $pos, $length); //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。 unset($k);//最后销毁一下哦。 } } */ $keys = array_keys($keywords); $tmpReplace = []; foreach($keys as $k=>$v){ $tmpReplace[] = $tmp = '['.$k.']'; } $content = str_replace($keys,$tmpReplace,$content); $content = str_replace($tmpReplace,array_values($keywords),$content); return $content; }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
function keywords_autolink($content) { $keywords=array( '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>', '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>', '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>', '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>', '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>' ); /* $keys=array_keys($keywords); foreach ($keys as $k) { $pos=strpos($content, $k); if ($pos !== false) { // Nothing found $length=strlen($k); $content=substr_replace($content, $keywords[$k], $pos, $length); //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。 unset($k);//最后销毁一下哦。 } } */ $keys = array_keys($keywords); $tmpReplace = []; foreach($keys as $k=>$v){ $tmpReplace[] = $tmp = '['.$k.']'; } $content = str_replace($keys,$tmpReplace,$content); $content = str_replace($tmpReplace,array_values($keywords),$content); return $content; }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
谢谢,但这个不行啊,会多次替换。
function keywords_autolink($content) { $keywords=array( '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>', '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>', '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>', '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>', '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>', '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>' ); /* $keys=array_keys($keywords); foreach ($keys as $k) { $pos=strpos($content, $k); if ($pos !== false) { // Nothing found $length=strlen($k); $content=substr_replace($content, $keywords[$k], $pos, $length); //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。 unset($k);//最后销毁一下哦。 } } */ $keys = array_keys($keywords); $tmpReplace = []; foreach($keys as $k=>$v){ $tmpReplace[] = $tmp = '['.$k.']'; $tmpfind = '/'.$v.'/'; $content = preg_replace($tmpfind,$tmp,$content,1); } $content = str_replace($tmpReplace,array_values($keywords),$content); return $content; }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
谢谢,上面是替换了一次,但企业管理书籍被替换了多次,并且企业管理没有被替换。
看看你的$keywords
第一个 企业管理书籍 替换为 带连接的企业管理书籍
第一个 企业管理 也替换为 带连接的企业管理书籍
第二个 企业管理 没有替换
怎么不对了
看看你的$keywords
第一个 企业管理书籍 替换为 带连接的企业管理书籍
第一个 企业管理 也替换为 带连接的企业管理书籍
第二个 企业管理 没有替换
怎么不对了
我看错了,代码正常,谢谢,本贴已结,可不可以再看看这个 http://bbs.csdn.net/topics/391942890

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Alipay PHP...

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

Article discusses essential security features in frameworks to protect against vulnerabilities, including input validation, authentication, and regular updates.
