带有array()的PHP str_replace被嵌套覆盖替换值

时间:2018-10-29 05:13:07

标签: php arrays foreach nested str-replace

我想用标记的文字替换文字。

tbl_glossary
id  word
1   apple pie
2   apple
3   juice

单词是数据库(MySQL)中的数组。然后,如果单词包含相同的值(例如,“苹果派”包含“苹果”),该单词就会被替换为单词。

$con = mysqli_connect(db_host, db_username, db_password, db_name);
$sql = "SELECT * FROM `tbl_glossary`";
$res = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($res)){
    $arr_taggedword[] = '<a href="#" data-toggle="tooltip" id="'.$row['id'].'">'.$row['word'].'</a>';
    $arr_word[] = $row['word'];
}

$text = "apple pie made with apple juice";

$results = $text;
foreach($arr_word as $key => $value) {
    $results = str_replace($value, $arr_taggedword[$key], $results);
}
echo $results;

然后结果显示为

<a href="#" data-toggle="tooltip" id="1"><a href="#" data-toggle="tooltip" id="2">apple</a> pie</a> made with <a href="#" data-toggle="tooltip" id="2">apple</a> <a href="#" data-toggle="tooltip" id="3">juice</a>

“苹果派”被嵌套。 有跳过/忽略替换单词以再次替换的想法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用strtr的数组形式,它将按从大到小的顺序进行所有替换,但也不会替换任何已替换的文本。将您的foreach循环替换为:

$results = strtr($text, array_combine($arr_word, $arr_taggedword));
echo $results;

输出

<a href="#" data-toggle="tooltip" id="1">apple pie</a> made with <a href="#" data-toggle="tooltip" id="2">apple</a> <a href="#" data-toggle="tooltip" id="3">juice</a>