自动链接字符串中的单词(如果它们存在于数组中)

时间:2019-01-18 19:50:05

标签: php string replace

我有一系列这样的单词和链接(按长度排序):

$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属性)...问题是...如何避免在链接内替换?

奖励:,如果该功能仅自动链接关键字的首次出现,而不在每次出现关键字时都生成链接,那会很好。

3 个答案:

答案 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>.

https://3v4l.org/1Jhak


为了获得额外的收益,我们需要使用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.

https://3v4l.org/8GFZr