我有一系列这样的单词和链接(按长度排序):
$replacement = array = [
'another example' => 'http://another-example.com',
'examples' => 'http://examples.com',
'example' => 'http://example.com',
];
我有这样的文字:
$content = "Two examples are the combination of an example and another example.";
我想用链接替换单词,并生成如下所示的关键字:
Two <a href="http://examples.com">examples</a> are the combination of an <a href="http://example.com">example</a> and <a href="http://another-example.com">another example</a>.
因此,我的方法是按长度对关键字数组进行排序,并替换值的键,并且在某种程度上,避免使用脚本替换链接中的单词(锚文本和href
属性)...问题是...如何避免在链接内替换?
奖励:,如果该功能仅自动链接关键字的首次出现,而不在每次出现关键字时都生成链接,那会很好。
答案 0 :(得分:2)
您可以尝试strtr。
如果给定两个参数,则第二个参数应为array('from'=>'to',...)形式的数组。返回值是一个字符串,其中所有出现的数组键都已被相应的值替换。 最长的键将首先尝试。替换子字符串后,将不再搜索其新值。
scp -r HOST:'"FILE1" "FILE2"' "DIR"
答案 1 :(得分:1)
首先,您需要稍微更改替换数组,以便可以使用正确的链接轻松替换文本。然后,您可以使用strtr()
。
foreach ($replacement as $orig => $sub) {
$replacement[$orig] = '<a href="'.$sub.'">'.$orig.'</a>';
}
/* So now $replacement looks like this:
array(3) {
["another example"]=>
string(56) "<a href="http://another-example.com">another example</a>"
["examples"]=>
string(42) "<a href="http://examples.com">examples</a>"
["example"]=>
string(40) "<a href="http://example.com">example</a>"
}
*/
$content = strtr($content, $replacement);
编辑:
如果您想精确匹配单词,则需要正则表达式。这是我要尝试的方法:
$content = "Two examples are the combination of an example and another example.";
$replacement = array(
'another example' => 'http://another-example.com',
'examples' => 'http://examples.com',
'example' => 'http://example.com',
);
$new_replacement = array();
foreach ($replacement as $orig => $sub) {
$new_replacement['/\b'.$orig.'\b/'] = '<a href="'.$sub.'">'.$orig.'</a>';
}
$orig = array_keys($new_replacement);
$sub = array_values($new_replacement);
$content = preg_replace($orig, $sub, $content, 1);
echo $content;
答案 2 :(得分:1)
您需要对\b
使用preg_replace。这样会将替换限制为完整的单词。
我使用implode构建正则表达式模式,使其变为:
"\b(another example)|(examples)|(example)\b/"
然后替换项使用正则表达式捕获的内容。
$replacement = [
'another example' => 'http://another-example.com',
'examples' => 'http://examples.com',
'example' => 'http://example.com',
];
$content = "Two examples are the combination of an example and another example.";
echo preg_replace("/\b(". implode(")|(", array_keys($replacement)) . ")\b/", "<a href=\"$0\">$0</a>", $content);
输出:
Two <a href="examples">examples</a> are the combination of an <a href="example">example</a> and <a href="another example">another example</a>.
为了获得额外的收益,我们需要使用preg_replace的第四个参数并循环数组。
这限制了preg_replace只能进行一次替换。
$replacement = [
'another example' => 'http://another-example.com',
'examples' => 'http://examples.com',
'example' => 'http://example.com',
];
$content = "Two examples are the combination of an example and another example,
Two examples are the combination of an example and another example.";
foreach($replacement as $find => $repl){
$content = preg_replace("/\b(". $find . ")\b/", "<a href=\"$repl\">$0</a>", $content, 1);
}
echo $content;
输出:
Two <a href="http://examples.com">examples</a> are the combination of an <a href="http://example.com">example</a> and <a href="http://another-example.com">another example</a>,
Two examples are the combination of an example and another example.