更好的例子是:
$string = "That is a very nice ford mustang, if only every other ford was quite as nice as this honda";
我想用制造商和型号的链接替换汽车名称,如果它们匹配,或者只是制造商,但是如果有制造商和型号,如果你使用str替换,它会把链接放在链接中...... / p>
$remove = array("ford mustang","ford","honda");
$replaceWith = array("<a href='fordID'>ford</a>","<a href='fordmustangID'>ford mustang</a>","<a href='hondaID'>honda</a>");
这给出了结果:
"That is a very nice <a href='<a href='fordmustangID'>ford mustang</a>ID'><a href='fordmustangID'>ford mustang</a></a>, if only every other <a href='fordmustangID'>ford mustang</a> was quite as nice as this <a href='hondaID'>honda</a>"
我只希望它创建一个超链接,如果没有这样的超链接:
"That is a very nice <a href='fordmustangID'>ford mustang</a>, if only every other <a href='fordID'>ford</a> was quite as nice as this <a href='hondaID'>honda</a>"
答案 0 :(得分:4)
我花了很多时间,但这就是我想出的:
function replaceLinks($replacements, $string){
foreach($replacements as $key=>$val){
$key=strtolower((string)$key);
$newReplacements[$key]=array();
$newReplacements[$key]['id']=$val;
//strings to make sure the search isn't in front of
$newReplacements[$key]['behinds']=array();
//strings to make sure the search isn't behind
$newReplacements[$key]['aheads']=array();
//check for other searches this is a substring of
foreach($replacements as $key2=>$val2){
$key2=(string)$key2;
/*
//debugging
$b = ($key=='11 22'&&$key2=='11 22 33');
if($b){
l('strlen $key2: '.strlen($key2));
l('strlen $key: '.strlen($key));
l('strpos: '.(strpos($key2,$key)));
}
*/
//the second search is longer and the first is a substring of it
if(strlen($key2)>strlen($key) && ($pos=strpos($key2,$key))!==false){
//the first search isn't at the start of the second search ('the ford' and 'ford')
if($pos!=0){
$newReplacements[$key]['behinds'][]=substr($key2,0,$pos);
}
//it's not at the end ('ford' and 'fords')
if(($end=$pos+strlen($key))!=strlen($key2)){
$newReplacements[$key]['aheads'][]=substr($key2,$end);
}
}
}
}
foreach($newReplacements as $key=>$item){
//negative lookbehind for words or >
$tmp="/(?<![\w>=])";
//negative lookbehinds for the beginnings of other searches that this search is a subtring of
foreach($item['behinds'] as $b){
$tmp.="(?<!$b)";
}
//the actual search
$tmp.="($key)";
//negative lookaheads for ends of other searches that this is a substring of.
foreach($item['aheads'] as $a){
$tmp.="(?!$a)";
}
//case insensitive
$tmp.='/ie';
$replacementMatches[]=$tmp;
}
return preg_replace($replacementMatches,'"<a href=\"".$newReplacements[strtolower("$1")]["id"]."\">$1</a>"' ,$string);
}
将它传递给你正在谈论的数组:
$replaceWith = array('ford mustang'=>123,'ford'=>42,'honda'=>324);
和一个字符串:
$string = "That is a very nice ford mustang, if only every other ford was quite as nice as this honda";
echo replaceLinks($replaceWith,$string);
它优先考虑较大的字符串键,因此如果您有ford
和ford mustang
,它将用链接替换ford mustang
。
不太实用,但可能有用。
$string = "That is a very nice ford mustang, if only every other ford was quite as nice as this honda";
$remove = array("/(?<![\w>])ford mustang(?![\w<])/",'/(?<![>\w])ford(?! mustang)(?![<\w])/',"/(?<![>\w])honda(?![<\w])/");
$replaceWith = array("<a href='fordmustangID'>ford mustang</a>","<a href='fordID'>ford</a>","<a href='hondaID'>honda</a>");
echo preg_replace($remove, $replaceWith,$string);
我使用带有负前瞻和后视的正则表达式来确保我们要替换的字符串部分不是字母数字序列的一部分(如 12ford23
或{{1触摸元素的开始或结束标记。